`TML PASCAL II`TML PASCAL II
             

            `TML PASCAL II

            une traduction de B. Capslock

            `INTRODUCTION

            Bienvenue dans TML II, la deuxime gnration du fameux langage
            de dveloppement Pascal sur Apple //GS. TML II implmente certaines
            nouvelles fonctions rendant la programmation plus facile et assurant
            une totale compatibilit avec le systme d'exploitation 5.0. En
            particulier, TML II accepte l'dition et la cration de ressources.
            Cette version est destine  tre employe sur un seul
            ordinateur; pour une utilisation sur un rseau AppleShare vous devez
            vous procurer la version TML spciale fonctionnant en rseau.
            Le langage de programmation TML Pascal est destin  satisfaire
            le plus grand nombre de programmeurs sur Apple IIGS. Il est bas sur
            le langage Pascal ANS avec de nombreuses extensions pour les
            programmeurs familiariss avec les supplments des autres Pascal.

            Le TML Pascal reconnait les Modules, entres/sorties en accs
            direct sur disque, et les sous-programmes standard comme Moveleft,
            Fillchar, etc. que l'on trouve dans les extensions de Pascal UCSD
            comme celui de Apple. Et bien entendu les possibilits du TML Pascal
            sur Macintosh comme le type 'casting' oprations sur un bit, les
            dclarations CYCLE et LEAVE, les Modules et davantage encore, 
            existent
            sur le TML Pascal de l'Apple II GS.

            Le TML Pascal pour l'Apple II GS a t conu pour tirer avantage
            et accder aux nouvelles possibilits de la machine. Il tourne en 
            vrai
            16 bits mode natif GS/OS. L'accs sous Pascal  chacune des routines
            du Toolbox de l'Apple II GS est possible de mme qu' celles de 
            Prodos
            16, de GS/OS et des ressources.

            Avec le Pascal TML, vous serez capable de dvelopper des
            applications autonomes GS/OS, des accessoires de bureau NDA et CDA,
            des aplications en mode texte ou graphique.
            En plus du dveloppement d'applications qui exploitent les
            avantages du Toolbox du II GS, le Pascal TML vous permet de 
            dvelopper
            ce que nous appelons des applications "plain vanilla" ou "textbox".
            Cette possibilit vous permet d'entrer dans les programmes 
            directement
             partir des exemples texte et de les compiler. Dans cet
            environnement, Pascal TML fourni une fentre console de 20 lignes 
sur
            80 colonnes en mode super-haute rsolution 640.

            Le guide d'utilisateur et manuel de rfrence du Pascal TML a t
            crit pour vous guider dans l'emploi du Pascal TML, cependant ce ne
            sont pas des livres d'apprentissage.

            Afin d'utiliser Pascal TML, il vous faudra un Apple II GS avec
            moniteur, un lecteur 3"1/2 800 Ko et une carte d'extension mmoire
            avec au moins 512 KO soit un total de 768 K de mmoire vive. Pour le
            dveloppement d'applications importantes, deux lecteurs 800 Ko ou un
            disque dur sont recommands. Une imprimante pour conserver le 
listing
            de vos sources sera galement la bienvenue.

            Si vous avez des questions relatives  TML ou  la programmation
            Pascal, vous pouvez nous contacter  notre service Clients, du Lundi
            au Vendredi entre 8h30 et 17h30 (heure locale) au 904 636 8592. En 
ce
            qui concerne les problmes plus techniques, nous vous conseilons
            d'appeler notre service Technique entre 14h et 17h au 904 636 0118.
            Et puis si vous prfrez nous envoyer une lettre, vous pouvez
            nous crire :

            TML SYSTEMS, Inc
            8837-B Goodbys Executive Drive
            Jacksonville, Florida 32217

            ```A PROPOS DU MANUEL:

            Ce manuel a t conu pour vous aider  dbuter rapidement avec
            TML Pascal II et aussi servir de manuel de rfrence quand votre
            niveau de programmation devient plus lev. Ce manuel est divis en
            quatre parties:

            1- le Guide de l'Utilisateur
            2- la programmation
            3- la Rfrence du langage
            4- les appendices

            Le guide de l'utilisateur vous introduit dans TML Pascal II et
            vous enseignera comment configurer votre systme pour l'utiliser et
            comment tirer le maximum de l'utilisation de TML Pascal. Le Guide de
            l'utilisateur a pour but de vous fournir une vue gnrale de
            l'environnement de travail TML Pascal II.

            La Programmation vous introduit dans les bases de TML Pascal II
            en vous enseignant comment crire chacun des cinq diffrents types 
de
            programmes utilisant TML Pascal II.

            La Rfrence du langage est une rfrence complte des
            possibilits fournies par TML Pascal II. Notez que cette section est
            une rfrence et non un guide du langage Pascal. Si vous n'tes pas
            familiaris avec le langage Pascal, vous aurez besoin d'un manuel
            supplmentaire qui vous enseignera le langage Pascal.

            Les Appendices rsument les messages d'erreur et les rsultats
            d'entres/sorties du TML Pascal II, les directives de compilation et
            les fonctions de la boite  outil de l'Apple //GS. De plus, un 
regard
            sur les possibilits les plus avances de TML Pascal II est donn 
            avec
            une comparaison de TML Pascal II avec TML Pascal original.

            ``CHAPITRE 1: PREMIER CONTACT


            Avant d'utiliser le Pascal TML vous devrez prendre des
            prcautions pour protger votre logiciel. Comme il est impossible
            d'utiliser directement la disquette fournie avec le Pascal TML (elle
            ne contient pas GS/OS) il peut tre suffisant de la protger contre
            l'criture lorsque vous l'utiliserez pour installer le Pascal TML 
sur
            votre disque dur. Cependant, il est prfrable de faire une 
            sauvegarde
            de la disquette livre et de ranger l'originale en lieu s|r.

            Rappelez-vous que la philosophie des systmes TML tant de vendre
            des produits de qualit  un prix abordable sans protection contre 
la
            copie, cela ne peut fonctionner que si vous jouez le jeu. Avec la
            licence vous pouvez faire des sauvegardes du logiciel pour vos 
            besoins
            personnels mais celles-ci ne doivent pas tre donnes ou utilises 
            par
            quelqun d'autre.

            Pour formater une nouvelle disquette et faire une sauvegarde vous
            pouvez utiliser votre programme habituel de copie (mais permettant 
la
            duplication des fichiers resources) ou mieux, en utilisant les
            fonctionalits du Finder. Si vous n'tes pas habitu  ces outils
            alors consultez leurs manuels respectifs.

            ```CONFIGURATION DU SYSTEME:

            La disquette de distribution Pascal TML contient tous les
            fichiers ncessaires  l'installation du Pascal TML. Un systme de
            dveloppement sur Apple II GS utilisant le Pascal TML peut tre
            configur de nombreuses faons, cependant dans les sections 
suivantes
            nous vous indiquons les configurations les plus courantes: 1 
lecteur,
            2 lecteurs, un disque dur.

            Pour construire un environnement de dveloppement Pascal TML vous
            aurez besoin de deux ensembles diffrents de logiciels :

            - logiciels Pascal TML
            - logiciels systme Apple II GS

            ````Un lecteur 800k:

            Un seul lecteur 800 Ko est la configuration minimum possible.
            Bien que cette configuration rduise l'espace disponible sur la
            disquette, elle permet un systme de dveloppement complet et 
            puissant
            utilisant le Pascal TML.

            Un systme de dveloppement sur une seule unit 800K contient le
            minimum de logiciels cits plus haut. Avec cette configuration vous
            disposez d'environ 100 Ko pour dvelopper vos applications, 
cependant
            il sera ncessaire de faire un peu de 'mnage' sur la copie de votre
            disquette TML en enlevant, notamment, les fichiers SAMPLES. Ceci 
vous
            permettra de disposer de plus de place pour sauver vos sources.

            ````Deux lecteurs 800k:

            Avec deux lecteurs 800 Ko il est tout  fait raisonnable
            d'utiliser le second lecteur pour stocker le code source de
            l'applications que vous dveloppez. Nanmoins, les fichiers 
            librairies
            doivent imprativement se trouver sur la disquette TML.

            ````Un disque dur:

            Un systme de dveloppement sur disque dur offre bien s|r la plus
            grande souplesse. Dans ce cas nous vous recommendons d'installer 
            toute
            la disquette systme de l'Apple II GS et celle de TML sur le disque
            dur. Cependant assurez-vous que vous utilisez bien la dernire 
            version
            du systme d'exploitation de la disquette Apple II GS et non une
            ancienne version. La dernire version GS/OS est minimum 5.0. Vous ne
            pourrez pas faire fonctionner ni TML ni vos applications dveloppes 
            
            partir de TML sur une version du systme GS/OS antrieure  5.0.

            ```LANGAGES INTERPRETES OU COMPILES:

            TML II est un langage compil. A cet gard, il diffre
            notablement des langages interprts, tel le Basic Apple.
            Un langage de programmation est constitu d'une collection
            d'instructions, expressions et autres, plus connus sous la
            dnomination de syntaxe ou structure du langage. Alors que les
            langages crits en langage machine sont gnralement 
            incomprhensibles
            pour un humain, ils sont pourtant totalement compris par le
            microprocesseur de l'ordinateur. Dans notre cas, le microprocesseur
            65816.

            Avant qu'une instruction crite en langage volu ne s'excute,
            elle doit d'abord tre traduite en langage compris par l'ordinateur:
            le langage machine. Le langage machine est constitu de suites de
            nombres binaires (0 et 1) compris par l'ordinateur comme tant une
            srie d'tats OUI-NON caractrisant les oprations que la machine 
est
            capable d'excuter. Bien s|r, une succession de 0 et 1 n'est pas
            facilement comprhensible par un homme.

            La plus grande partie de chaque langage de programmation est
            constitue de la translation des programmes en langage machine. Dans
            un langage interprt, cette translation se fait lorsque le 
programme
            s'excute. Cette mthode est parfois dnomme ' la vole'. Si une
            instruction du programme est excute 100 fois par exemple, la
            translation en langage machine est excute 100 fois galement par
            l'interprteur. Gnralement, les langages interprts s'excutent
            plus lentement que les langages compils du fait de la translation 
            qui
            se produit durant l'excution du programme.

            D'un autre cot, un langage compil traduit un programme en
            langage machine avant son excution. Ainsi, chaque ligne du 
programme
            est traduite une seule fois (lors de la compilation). De plus, la
            compilation traque toutes les erreurs de syntaxe du programme avant
            son excution. Bien entendu, le compilateur ne peut dceler les
            erreurs de logique (par exemple les boucles infinies).

            Gnralement, les langages compils s'excutent bien plus
            rapidement que les langages interprts. De plus, les langages
            compils peuvent tre excuts indpendamment de tout langage
            processeur. Ainsi, les programmes compils TML peuvent tre excuts
            sous GS OS sans que TML soit utilis. Au contraire du Basic 
            Applesoft,
            dont les programmes ne peuvent tre excuts que si le langage Basic
            est pralablement charg en mmoire.

            ```ET MAINTENANT ?:

            Si vous tes dbutant en programmation, lisez entirement le
            manuel TML et procurez-vous un bon livre d'initiation  la
            programmation Pascal (par exemple TOPIQUES PASCAL de J Colibri aux
            ditions Mnemodyne).
            Si vous connaissez la programmation du GS avec un langage autre
            que Pascal, il vous suffit de lire les chapitres 4  10 afin de
            connaitre les spcificits du TML et les programmes que l'on peut
            dvelopper dans un tel environnement.
            Si vous connaissez dja bien le Pascal, l'appendix E sera votre
            seul livre de rfrence pour connaitre les diffrentes fonctions de 
            la
            boite  outils.

            ``CHAPITRE 2: UTILISATION DE TML

            ```LANCER TML:

            Mettez une copie de votre disquette TML dans un lecteur 3'1/2 et
            allumez votre ordinateur. Lorsque le boot est termin, le bureau du
            finder est affich avec l'icone de la disquette TML dessin dans la
            partie droite de l'cran.
            Cliquez sur cet icone, et ensuite slectionnez l'option OPEN du
            menu FILE (ou alors double-cliquez sur l'icone TML). Une fentre
            s'ouvre: double-cliquez sur l'icone TML II afin de charger en 
mmoire
            le langage TML.

            ```L'ENVIRONNEMENT DE PROGRAMMATION:

            TML II est conu pour tirer plein avantage des possibilits du
            GS: interface souris, menus droulants, multi-fentrage.... Avec un
            tel outil, la programmation est simplifie: l'diteur et le
            compilateur fonctionnent dans le mme environnement de travail.

            Le menu principal de TML permet uniquement l'dition d'un fichier
            Source ou Resource. Dans ce chapitre et le suivant, nous verrons
            comment diter un fichier source; dans le chapitre 4 nous traiterons
            de la spcificit des fichiers Resources.

            ```EDITION DES FICHIERS SOURCE:

            Les fentres d'ditions sont des outils de TML permettant la
            cration/modificaion aise de vos sources. TML vous autorise  avoir
            autant de fichiers sources ouverts simultanment que le permet la
            mmoire disponible de votre systme. Bien videmment, plus la RAM
            disponible dans votre GS sera importante, plus vous disposerez de
            place pour crer des programmes et ouvrir des fentres d'dition.

            Au fur et  mesure que vous ouvrez de nouveaux fichiers source,
            TML les place dans des nouvelles fentres d'dition indpendantes 
les
            unes des autres. Mais une seule fentre d'dition ne peut tre 
active
             la fois. La fentre active est toujours celle situe au premier
            plan, celle o| les commandes seront actives.

            TML utilise galement des dialogues pour communiquer avec
            l'utilisateur. Ces dialogues servent gnralement  informer le
            programmeur qu'il doit fournir certains lments afin de continuer 
            son
            travail (ou corriger certains lments errons). Les dialogues
            utilisent galement des boutons OK/CANCEL ou YES/NO pour confirmer 
ou
            infirmer vos dcisions.

            ````Menu d'dition des fichiers source:

            Choisissez l'option OPEN du menu FILE. Un dialogue standard de
            chargement de fichier apparait  l'cran. Cliquez sur le bouton 
radio
            SOURCE TEXT FILE puis double-cliquez sur le fichier HELLOWORLD dans 
            le
            dossier HELLOWORLD. Presque instantanment, le listing s'affiche 
dans
            une fentre d'dition. Vous remarquerez qu'alors la barre de menus
            comprend de nouvelles options: les outils d'dition. Ces outils 
            seront
            tudis en dtail au cours du chapitre 5.

            ````Conventions de dnominations:

            Lorsque vous avez ouvert le dossier HelloWorld, vous avez
            surement not la prsence de diffrents fichiers aux noms trs
            voisins. Ces similitudes sont justement la rsultante des 
conventions
            de dnomination des diffrents fichiers. Tout ceci afin de
            diffrencier les fichiers Source, Resource et Application.

            Voici les convention que nous avons adoptes pour nommer les
            fichiers gnrs  partir de TML:

            fichier Source : utiliser le suffixe .P  la fin des noms
            fichier Resource: utiliser le suffixe .R  la fin des noms
            application : TML ote automatiquement les suffixes pour crer le
            nom de l'application

            Attention, TML ne cre pas automatiquement les noms en respectant
            ces rgles: c'est  vous de suivre ces rgles lors de la cration de
            nouveaux fichiers.

            ````Rgles de base pour l'dition:

            L'diteur TML est trs similaire aux traitements de textes
            traditionnels. Ainsi l'utilisateur averti du GS ne sera pas dpays
            pour diter ses fichiers sources avec TML. Vous disposez des
            fonctionnalits suivantes:

            - couper, copier, coller et annuler sur des blocs de texte
            - recherche et remplacement de texte
            - indentations (tabulations)
            - choix de la fonte et de sa taille
            - dfilement par ascenseurs
            - impression sur Imagewriter ou Laserwriter

            D'un autre cot, TML dispose de commandes spcifiques:

            - vrifier la syntaxe d'un fichier source
            - excuter un programme
            - crer une application
            - utiliser certaines commandes GS OS (renommer, copier)
            - indiquer les erreurs de programmation

            Avec le fichier source de HelloWorld, familiarisez-vous avec les
            diffrentes commandes d'dition. Par exemple, copiez-collez une zone
            de texte, changez de fonte et de taille dans la fentre d'dition,
            annulez vos modifications....
            Avec les chapitres 3 et 5 nous tudierons en dtail les
            diffrents options disponibles avec TML.

            ``CHAPITRE 3: CREER UN PROGRAMME:

            ```LES COMPILATIONS:

            TML dispose de trois options de compilation: TO MEMORY, TO DISK
            et CHECK SYNTAX. Ces commandes de compilation se trouvent dans le 
            menu
            COMPILE.
            La compilation TO MEMORY est certainement celle que vous
            utiliserez le plus souvent. Cette commande effectue une compilation 
            du
            source se trouvant dans la fentre active. En cas de russite, la
            compilation se poursuit par l'excution du programme compil en
            mmoire.

            La commande de compilation TO DISK est similaire  la prcdente,
            mais le programme compil n'est pas excut, il est sauv sur 
disque.
            Cette commande est utilise lorsque votre programme est termin et
            test: cette commande produit alors l'application excutable  
partir
            d'un launcher.

            Enfin, CHECK SYNTAX permet de vrifier rapidement la syntaxe du
            source se trouvant dans la fentre active. Il n'y a ni excution du
            programme compil ni sauvegarde sur disque dans ce cas.

            Lorsqu'une option de compilation est utilise, une fentre est
            affiche indiquant la progression du processus. Lorsque le
            'thermomtre' a atteint le bord droit, la compilation est termine.

            ```TESTER UN SOURCE:

            La commande Check Syntax est l'option de compilation la plus
            rapide: il n'y a pas de code gnr, mais vrification de la bonne
            orthographe des mots cls, des instructions, des fonctions...
            Cependant, cela ne teste pas la logique du programme. Par exemple, 
            une
            boucle infinie ne pourra tre dtecte par Check Syntax.

            Ouvrez le fichier exemple TextBook.p et lancez l'option de
            compilation Check Syntax. Lorsque le 'thermomtre' est en bout de
            course, la vrification est termine. Ceci n'a pris que quelques
            secondes, grace aux performances du compilateur TML et  la 
compacit
            du code source test.

            Si le test indique qu'aucune erreur n'a t dtecte, cela ne
            signifie pas que le programme est parfait. Cela garantie juste qu'il
            n'y a pas d'erreur de syntaxe.
            Il est important de procder  une vrification de syntaxe pour
            dtecter les erreurs qui provoqueraient un 'plantage' du programme
            lors de son excution aprs Compile to Memory.

            Si une erreur est dtecte, la compilation est interrompue et TML
            affiche une fentre indiquant le type d'erreur. Dans la fentre
            active, la zone responsable de l'erreur est affiche en mode 
inverse.

            ```EXECUTION D'UN PROGRAMME:

            Lorsque vous tes certain que votre programme ne comporte aucune
            erreur de syntaxe, il est temps de le faire fonctionner. Pour cela, 
            la
            commande de compiltion To Memory sera adquate. Lors de la
            compilation, TML gnre un code qui sera excut  partir de la
            mmoire du GS. L'environnement de programmation sera ferm 
(fentres,
            menus) et votre application lance. Lorsque vous quitterez votre
            programme, vous reviendrez dans TML automatiquement, avec le bureau
            dans l'tat o| vous l'aviez quitt (fentres ouvertes, sources
            affichs...).

            Comme il est possible que votre source contienne des erreurs de
            logique provoquant un plantage los de l'excution, TML permet de
            sauver le bureau juste avant le lancement de votre code compil. 
            Cette
            possibilit s'appelle AUTOSAVE. Si cette option est connecte, TML
            effectue une sauvegarde de tous les fichierss ouverts modifis 
depuis
            la dernire compilation. Cette option vous permet de ne pas risquer 
            de
            perdre votre travail si le GS est bloqu par une erreur lors de
            l'excution du programme en mmoire. L'option AUTOSAVE est commente 
            au
            chapitre 5.

            ```CREER UNE APPLICATION:

            Comme on l'a vu prcdemment, la compilation en mmoire est trs
            rapide et trs pratique. Cependant elle oblige chaque fois  lancer
            TML et  compiler le source de l'application pour l'excuter.
            Heureusement, il existe un moyen plus facile pour lancer une
            application. Pour cela, il faut effectuer une compiltion To Disk. 
            Cela
            va crer un programme excutable  partir des launchers 
            traditionnels.
            Ds lors, il n'y aura plus besoin de TML pour lancer votre 
            applicaion:
            elle sera auto-lanable.

            La compilation sur disque est lgrement plus longue que les
            autres modes de compilation du fait de la sauvegarde du code sur
            disquette.
            Le nom du programme compil est le mme que celui du source, le
            suffixe '.p' en moins.

            ```COMPILATION DES UNITS:

            De la mme manire que TML compile un programme, il peut compiler
            une Unit. Cette compilation ne peut gnrer un programme excutable,
            mais elle sert  produire un code contenant des informations 
            relatives
             votre application. Les Units sont utilises pour fractionner un
            programme trs volumineux en units logiques. Une Unit peut 
            comprendre
            des constantes, des types, des variables, des procdures et des
            fonctions.

            Comme une Unit ne peut tre excute, le compilateur TML agit
            diffremment avec un tel source. Si on compile en mmoire une unit,
            TML effectue la compiltion puis rend la main  l'diteur au lieu
            d'excuter le code. Lors de cette compilation, le code de l'Unit est
            sauv en mmoire et peut donc tre utilis ultrieurement par un
            programme.

            Si on compile sur disque une Unit, TML ne vas pas crer une
            application excutable, mais un fichier objet contenant la table des
            symboles et les librairies compiles. Le code ainsi produit sera 
            sauv
            avec le suffixe '.p.o'. Si un autre programme ou Unit faisant appel 

            cette Unit est compil, le fichier code '.p.o' de l'unit utilise 
            sera
            recherch par TML.
            Le nom du fichier de l'Unit compile est le nom du fichier source
            suivi du suffixe '.o'. ainsi, le code objet d'une unit se termine 
par
            '.p.o'.
            La commande Check Syntax fonctionne comme pour un programme
            normal. De ce fait, Check Syntax va seulement vrifier si l'Unit ne
            contient pas d'erreur de syntaxe dans ses instructions.

            ```DETECTION DES ERREURS:

            Jusqu' prsent, nous avons parl des processus de compilation se
            produisant sans erreur. Voyons un peu comment TML dtecte et gre 
les
            erreurs.
            TML est constitu de trois parties: l'diteur, le compilateur et
            le linker. Ces trois parties fonctionnent en inter-relation et 
            donnent
            l'illusion de n'tre qu'une seule et mme entit. Mais en comprenant
            comment ces trois parties fonctionnent, vous saurez mieux comment 
TML
            dtecte les erreurs de vos programmes sources.

            L'diteur, bien entendu, est ce que vous utilisez la plupart du
            temps. Il permet d'ouvrir les fentres contenant vos programmes et 
la
            majorit des commandes des menus sont applicables  l'diteur. Le
            compilateur est utilis lorsque vous choisissez une des trois
            commandes de compilation. Il permet de dtecter les erreurs de 
            syntaxe
            et de produire un code objet. Enfin, le linker est employ 
uniquement
            lors de la compilation sur disque ou en mmoire. Il va combiner les
            diffrents programmes objets (les units) et allouer la mmoire 
            interne
            ncesssaire  votre application.

            L'diteur va seulement indiquer les erreurs se produisant dans
            l'environnement d'dition. Par exemple, il va indiquer une erreur si
            vous sauvez un fichier sur disquette protge en criture, ou si 
vous
            ouvrez un fichier sans disposer de suffissamment de mmoire. Le
            compilateur indique les erreurs relatives  un code incorrect. Enfin
            le linker dtecte les erreurs survenant lors de la cration du 
            fichier
            GS OS: par exemple si la disquette est verrouille, o| si le 
            directory
            est plein...

            Lorsqu'une erreur est dtecte, TML va mettre en oeuvre une srie
            d'actions afin de ne pas perdre vos donnes et afin d'afficher une
            fentre de dialogue indiquant la cause prsume de l'erreur. A cot 
            du
            message, un icone vous indique le type de l'erreur. Enfin, si 
            l'erreur
            est relative  une partie de votre source, la partie concerne est
            affiche en mode inverse dans sa fentre d'dition.

            Les erreurs d'dition sont indiques par un triangle enfermant un
            point d'exclamation; les erreurs de compiltion sont signales par 
une
            sorte de coccinelle verte et les erreurs de linkage sont signales 
            par
            une chaine. Si dans le message dcrivant l'erreur est indiqu un
            numro d'erreur, celui-ci est un code d'erreur standard GS OS tel 
que
            dcrit dans les manuels GS OS. L'appendix A comprend la liste des
            messages d'erreurs retourns par TML.





            ``CHAPITRE 4: LES RESSOURCES

            ```INTRODUCTION:

            L'ajout le plus intressant du systme 5.0 est le Resource
            Manager (Gestionnaire de Ressources). Le Resource Manager est un 
            outil
            spcial qui manipule les ressources stockes dans la Composante de
            Ressource des fichiers GS OS. Rappelez-vous qu'un fichier stock 
sous
            GS OS peut avoir deux composantes: la composante donne et la
            composante de ressources. Un fichier n'a encore qu'un seul nom, mais
            chaque composante peut-tre ouverte et consulte sparment de
            l'autre.

            fichier GS OS 







            La composante de donnes est typiquement manipule en utilisant
            les appels du systme GS OS: ouvrir, lire, crire et fermer le
            fichier. Le fichier est simplement trait comme une collection
            d'octets sur un disque ou un autre priphrique de stockage.
            L'organisation des donnes dans la composante de donnes n'est pas
            bien dfinie et est typiquement trs diffrente pour chaque type de
            fichier. Voir GS OS REFERENCE pour une documentation complte
            concernant les routines fournies par GS OS pour manipuler une
            composante de donnes.

            Une composante de ressource, d'autre part, est manipule en
            utilisant le Resource Manager. Le Resource Manager dfinit la
            structure prcise pour la composante de ressources et fournit
            plusieurs routines pour accder et manipuler les informations 
            stockes
            dans la composante de ressource. TML Pascal II ajoute un diteur de
            Resources pour crer et diter graphiquement des ressources, et 
c'est
            le sujet de ce chapitre. Pour une documentation complte sur la
            composante de ressources contenu par le Resource Manager, voir le
            manuel Apple //GS Toolbox Rfrence Update.

            ```LES RESSOURCES:

            Une ressource est une collection de donnes formates, organises
            d'une certaine manire, qui reprsente un menu ou une barre de menu,
            une fentre, une chaine d'alerte, ou tout autre nombre ou type de
            donnes dfinis par le systme ou par l'utilisateur. La structure
            exacte de chaque type de ressource n'est pas dfinie par le Resource
            Manager. Le Resource MAnager dfinit seulement comment les 
ressources
            sont stockes sur le disque, non leur contenu.
            Un programme identifie une ressource par son Resource Type et son
            Resource ID. Le Resource Type dfinit une classe ou un groupe de
            ressources qui partagent un format commun. Le Resource ID identifie
            uniquement un cas (exemple) de ressource d'un ressource type donn.
            Runis, le Resource Type et le Resource ID identifient compltement 
            la
            ressource et son format. Notez qu'un Resource ID est seulement 
unique
            parmi un Resource Type. Deux ressources de diffrents Resources 
Types
            peuvent avoir le mme Resource ID.

            Le Resource Type est un nombre entier de deux octets. La table
            suivante montre les champs de types de ressources:

            Types de ressources dfinis par Apple

            suite Resource Type

            $0000 numro de resource type non valable
            (ne pas utiliser)
            $0001-$7FFF valable pour l'utilisation des applications
            $8000-$FFFF rserv pour l'utilisation du systme

            Parmi les types de ressources rservs pour l'utilisation du
            systme, Apple a prdfini plusieurs types de ressources. Ces types 
            de
            ressources prdfinis sont utiliss pour stocker les reprsentations
            des lments de la boite  outils du //GS. Par exemple, une 
ressource
            put tre utilise pour dfinir la structure et les contenus d'un 
            menu
            ou d'une fentre. Ces ressources prdfinies sont montres dans le
            tableau suivant:

            TML Nom du Resource Type Numro (hex) du Resource Type

            rIcon $8001
            rPicture $8002
            oui rControlList $8003
            oui rControlTemplate $8004
            oui rPString $8006
            rStringList $8007
            oui rMenuBar $8008
            oui rMenu $8009
            oui rMenuItem $800A
            rTextForLETextBox2 $800B
            rCtlDefProc $800C
            oui rWindParam1 $800E
            rWindParam2 $800F
            rWindColor $8010
            oui rTextBlock $8011
            rStyleBlock $8012
            oui rToolStartup $8013
            rResName $8014
            oui rAlertString $8015
            oui rText $8016
            rCodeResource $8017
            rCDEVCode $8018
            rCDEVFlags $8019
            rTwoRects $801A
            rListRef $801C
            oui rCString $801D
            oui rErrorString $8020

            Le nom de Resource Type dans la table ci-dessus est donn dans un
            but de description. En plus, l'unit d'interface Resource.p de la
            Boite  outils Apple //GS utilise les mmes noms comme constantes 
            dont
            les valeurs sont celles indiques dans la table. La colonne TML
            indique si l'diteur de ressource TML fournit l'dition des 
            ressources
            donnes.

            Comme mentionn au-dessus, chaque ressource a un Resource Type et
            un Resource ID. Un Resource ID est un entier long de quatre octets. 
            La
            table ci-dessous montre les champs de Resource ID:

            Champ Resource ID

            $00000000 numro de Resource ID non valable
            (ne pas utiliser)
            $00000001-$07FEFFFF pour l'utilisation des applications
            $07FF0000-$07FFFFFF rserv au systme
            $08000000-$FFFFFFFF valeurs a ne pas utiliser

            Lorsqu'on cre de nouvelles ressources, un Resource ID unique
            peut-tre obtenu pour le Resource Type auquel la ressource 
            appartient.
            Le Resource Manager fournit la routine UniqueResourceID dans ce but.
            Les Resource IDs sont importants  retenir, parcequ'ils sont 
rclams
            comme parameters pour plusieurs routines de la boite  outils qui
            chargent et crent des menus, fentres etc...

            ```L'EDITEUR DE RESSOURCES:

            ````Introduction:

            Comme mentionn prcdemment, TML Pascal contient un diteur de
            ressources. L'Editeur de Ressources de TML est utilis pour crer
            graphiquement et diter plusieurs des types de ressources prdfinis
            par Apple. En utilisant l'diteur de ressources, vous pourrez crer
            des menus, fentres, alertes, chaines etc.. uniquement en cliquant 
la
            souris. Les ressources que vous crez peuvent tre incorpors 
            l'intrieur d'un programme dans le but de crer rapidement et
            facilement des applications de bureau (desktop) complexes.

            ````Resource Document Window:

            Quand TML ouvre un fichier ressource, il affiche une fentre.
            Cette fentre contient deux listes droulantes. La liste de gauche
            affiche chaque Resource Type pour lequel une ressource existe dans 
le
            fichier ressource. L'affichage donne le numro du Resource Type et
            optionnellement un nom de Resource Type. Seules les ressources que
            l'Editeur de Ressources fournit sont montres avec un nom de 
Resource
            Type. Cela permet de distinguer quelles ressources peuvent tre
            dites ou non.

            La liste de droite affiche chaque ressource existant pour le type
            slectionn dans la liste de gauche. La liste affiche le numro de
            Resource ID. Par exemple, le Resource Type fentre est slectionn 
et
            le fichier contient deux ressources fentres (1001 et 1002). Pour
            diter une ressource particulire, double cliquez simplement sur son
            Resource ID.

            En plus de ces deux listes, la fentre du document Resource
            contient un pop-up menu et un bouton. La Nouvelle Ressource bouton 
            est
            utilise pour crer de nouvelles ressources du type actuellement
            slectionn. Le pop-up menu est utilis pour crer une nouvelle
            ressource quand le Resource Type n'existe pas encore dans le 
fichier.

            Chaque ressource a son jeu d'attributs qui dfinit comment la
            ressource peut tre utilise. Les attributs sont stocks par le
            Resource Manager pour chaque ressource dans l'attribute flag word. 
En
            plus, le Resource Manager fournit deux routines: GetResourceAttr et
            SetResourceAttr pour lire et crire des attributs de ressource.

            L'diteur de ressource TML fournit un bouton "Attr..." dans
            chaque fentre d'dition de ressource. En cliquant ce bouton on
            affiche la fentre de dialogue d'Attributs de ressource avec les
            attributs actuels de ces attributs de ressource. Cliquer sur le 
            bouton
            OK dans le dialogue va mettre  jour la nouvelle configuration des
            attributs de ressource.

            Voici la signification de chacun des attributs de ressource:

            Locked (verrouil) si cet attribut est mis, alors le Resource
            Manager appelera NewHandle pour crer un
            handle verrouill quand il allouera la
            mmoire pour la ressource.
            Fixed (fix) si cet attribut est mis, le Resource Manager
            appellera NewHandle pour crer un Handle Fix
            quand il allouera la mmoire pour le
            ressource.
            Resource Converter cet attribut indique si la reprsentation de
            la ressource comme elle est stocke dans la
            composante de ressource du fichier doit tre
            convertie en une reprsentation diffrente
            quand elle est lue  l'intrieur de la
            mmoire. Si l'attribut est mis, la ressource
            doit tre convertie.
            Write-protection si cet attribut est mis, la ressource est
            protge en criture. Ce qui signifie qu'une
            application ne peut remettre  jour les
            contenus de ressource de la composante de
            ressource d'un fichier.
            Preload si cet attribut est mis, le Resource Manager
            chargera automatiquement la ressource en
            mmoire avec son fichier ressource si le
            fichier est ouvert. Si une ressource n'est
            pas configure pour tre pr-charge alors
            elle doit tre charge en mmoire de manire
            explicite avec la routine LoadResource du
            Resource Manager.
            Do not cross bank si cet attribut est mis, le Resource Manager
            demandera a NewHandle de crer un handle qui
            ne sortira pas d'un banc mmoire lors de
            l'attribution de Stockage pour la ressource.
            Do not use special si cet attribut est mis, le Resource Manager
            demandera  NewHandle de crer un handle qui
            n'occupera pas de mmoire spciale lors de
            l'attribution de mmoire pour la ressource.
            Page aligned si cet attribut est mis, le Resource Manager
            demandera  NewHandle de crer un handle
            d'alignement de page lors de l'attribution de
            mmoire pour la ressource.
            Purge level le Resource Manager donne la valeur du niveau
            de purge  NewHandle quand il alloue la
            mmoire pour la ressource.

            *NOTE: la valeur par dfaut de tous les attributs de ressource est 
            NOT
            et chacun des niveaux de purge de zzo (0).

            ```PASCAL STRING RESOURCE:

            La chaine Pascal (rPString) stocke une chaine jusqu' 255
            caractres ASCII. La chaine commence avec un octet entier qui est un
            compte indiquant le nombre de caractres qui suivent dans la
            ressource. Les ressources Pascal String sont largement utilises par
            les autres types de ressources. Par exemple, les types de ressources
            rMenuItem, rMenu, rWindParam1 et plusieurs des diffrents
            rControlTemplate rfrencent une ressource rPString pour stocker 
            leurs
            titres.

            ```C STRING RESOURCE:

            La chaine C (rCString) stocke une chaine qui se termine par un
            octet mis  0. Il n'y a pas de restriction sur le nombre de 
            caractres
            contenus dans une ressource chaine C. Les ressources rCString ne 
sont
            pas souvent utilises dans les programmes en TML PAscal, parceque le
            Pascal ne fournit pas le mcanisme naturel pour utiliser ces types 
de
            chaines. Cependant l'Editeur de Ressource de TML supporte ce 
Resource
            Type.

            ```ALERT STRING RESOURCE:

            La chaine Alerte (rAlertString) stocke une chaine de caractres
            qui est termine par un octet zro (nul). La chaine est utilise 
avec
            la fonction AlertWindow du Window Manager pour afficher de simples
            fentres d'alerte. La ressource chaine d'alerte stocke le message
            devant appraitre dans une fentre d'alerte avec les codes spciaux 
            qui
            dfinissent la taille de la fentre, si un icone apparait ou non, et
            les boutons.
            Pour une descriptiion complte du format et de la structure de la
            chaine d'alerte, voir le chapitre Window Manager de l'Apple //GS
            Toolbox Reference Update.
            L'diteur de ressources du TML Pascal II permet l'dition et la
            cration de chaines d'alerte pour utiliser avec la procdure
            AlertWindow du Window Manager. Cependant les chaines d'alerte ont un
            formatage trs spcial:

            - une chaine d'alerte (AlertString) doit commencer par un
            caractre de sparation (le caractre / est recommand)
            - le caractre de sparation est utilis pour sparer un texte de
            chaine d'alerte (AlertTextString) des boutons chaine d'alerte
            (AlertStringButtons). Pour crer un bouton dans une alerte,
            entrer simplement le caractre de sparation suivi par le caret
            (accent circonflexe), un symbole pound (#) et finalement un
            chiffre entre 0 et 6 correspondant aux titres des boutons
            suivants:

            #0 OK
            #1 Cancel
            #2 Yes
            #3 No
            #4 Try again
            #5 Quit
            #6 Continue

            - les codes de formatage de LETextBox2 sont permis  l'intrieur
            d'un texte de chaine d'alerte. Ces codes sont entrs en
            utilisant le bouton "Insert LETextBox2" dans le dialogue
            AlertStringResource de TML Pascal II. Les options de formatage
            doivent tre entres aprs que tous les AlertStringText l'aient
            t, car les codes sont des caractres invisibles ce qui rend
            leur dition difficile. Les codes de LETextBox2 sont
            compltement documents dans le chapitre LineEdit du manuel de
            rfrence de la Toolbox Apple IIGS.

            ```TOOL STARTUP RESOURCE:

            La ressource rToolStartup est utilise par une application pour
            spcifier  la boite  outils du IIGS quels outils sont requis par
            l'application et si l'application utilise le mode cran 320 ou 640.
            La ressource rToolStartup est utilise avec une nouvellle
            fonction StartupTools et la fonction ShutDownTools fournies par les
            outils du ToolLocator. Ces deux routines utilises ensembles avec
            rToolStartup implmente le travail ncessaire pour commencer 
            utiliser la boite  outil du IIGS. Ces oprations comprennent:

            - dmarrer le Resource Manager
            - ouvrir une ressource fourche d'application
            - allouer le montant appropri de page directe pour les outils
            qu'il utilise
            - dmarrer chaque outil utilis par l'application

            ```MENU BAR RESOURCE:

            La ressource barre de menu (rMenuBar) est une suite ordonne de
            ressources Menu qui dfinit une barre de menu. La ressource est
            utilise par la procdure NewMenuBar2 du Menu Manager pour crer une
            barre de menu de l'application.
            Le long rectangle en haut du dialogue reprsente la barre de menu
            actuellement dfinie par la ressource. La liste droulable dans le
            coin en bas  gauche est une liste complte de chaque ressource Menu
            dans le fichier ressource ouvert. Les boutons Insert Menu et Delete
            Menu sont utiliss pour ajouter des menus ou en effacer de la barre 
            de
            menu. Pour ajouter un nouveau Menu dans la barre de menu, 
            premirement
            slectionner le menu dans la barre de menu o| le menu nouvellement
            ajout devra tre plac aprs. Puis slectionner le menu  ajouter
            depuis la liste des menus valables, et finalement cliquer le bouton
            Insert Menu. Pour effacer un menu de la barre de menu, slectionner 
            le
            menu  effacer dans la barre de menu puis cliquer sur le bouton 
            Delete
            Item.

            ```MENU RESOURCE:

            La ressource Menu (rMenu) est une suite ordonne de ressources
            MenuItem qui dfinit un menu. Les ressources Menu sont typiquement
            rfrences par les ressources Menu Bar, mais peuvent tre utilises
            directement par la routine NewMenu2 de l'outil Menu Manager.
            La ressource Menu est une des deux super Ressources que l'Editeur
            de Ressources TML permet (l'autre est la ressource Fentre). Une
            ressource Menu comme dfinie par Apple stocke simplement les
            rfrences vers les autres ressources. En particulier une ressource
            chaine Pascal pour le titre du menu et ensuite une suite ordonne de
            rfrences pour les ressources MenuItem (rMenuItem). Chaque 
ressource
            MenuItem a ses propres rfrences une autre chaine pascal pour son
            titre. Par exemple, un menu avec seulement 6 menus items (lments 
de
            menus) consiste actuellemnt en 14 diffrentes ressources. Une pour 
la
            ressource Menu, une pour la ressource chaine pascal pour le titre du
            menu et six ressources Menu Items qui rfrencent six chaines pascal
            pour leurs titres. En clair, crer les nombreux menus qu'une
            application requiert serait une tache trs fastidieuse si chaque
            ressource devait tre cre et rfrence individuellement. En
            consquence, l'Editeur de Ressource TML groupe toutes ces taches
            d'dition de ressources en de simples dialogues pour crer et diter
            facilement des Ressources Menu. L'Editeur de Ressource TML ne 
fournit
            pas de signification directe d'dition de ressource Menu Item.
            L'dition de l'lment en haut  gauche du dialogue est le titre
            du menu. La liste droulable dans la partie gauche du dialogue est 
la
            liste actuelle d'lments menu (Menu Item) contenus dans le menu. 
            Pour
            diter un lment de menu particulier cliquer simplement sur son nom
            dans la liste. Quand un lment menu est slectionn, son nom et ses
            caractristiques sont affichs dans plusieurs lments de la partie
            droite de l'affichage du dialogue.
            L'Editeur de Ressource vous permet de spcifier un des cinq types
            de style pour dessiner les lments du menu titre, et si l'lment 
du
            menu a une ligne de sparation et/ou est valid. En plus vous pouvez
            spcifier un quivalent touche de commandes pour l'lment du menu 
et
            un caractre de marquage. L'item ID est la valeur retourne par
            TaskMaster ou MenuSelect dans une application quand l'utilisateur
            slectionne un lment du menu. L'Editeur de Ressource utilise aussi
            ce nombre comme le ressource ID de la ressource Menu Item et sa
            ressource chaine pascal de titre.

            ```WINDOW RESOURCE:

            La ressource fentre (rWindParam1) stocke les informations
            ncessaires pour crer une fentre sur le bureau Apple //GS 
(Desktop)
            en utilisant la fonction NewWindow2 du Window Manager. La ressource
            fentre dfinit l'emplacement de la fentre, la taille zoom, le 
            titre,
            la dfinition de l'encadrement (frame) et les autres attributs. En
            plus, la ressource peut rfrencer une liste de controles intgrs.
            Les controles intgrs peuvent tre des boutons, des boites test
            (check box), des boutons radio, une dition de texte, des 
ascenseurs,
            des pop-up menus... qui apparaissent dans le contenu de la fentre.
            La ressource fentre est la deuxime des deux super ressources
            que l'Editeur de Ressource TML supporte (l'autre est la ressource
            Menu). Comme la ressource Menu, la ressource fentre peut rfrencer
            de nombreuses autres ressources. Une fentre peut rfrencer une
            ressource chaine pascal pour son titre, et si la fentre a des
            controle sintgrs, il rfrencie une ressource Control List
            (rControlList). Une ressource ControlList rfrencie ensuite 
            plusieurs
            ressources Control Template (rControlTemplate) pour chaque bouton,
            boite test, bouton radio, lment d'dition de texte, ascenseurs, 
            menu
            po-up etc... qui apparait dans la fentre. Et plus loin, chaque
            Control Template peut rfrencer uen ressource chaine pascal pour 
son
            titre. En clair, crer une ressource fentre serait une tache trs
            pnible si chacun de ces lments devait tre cr individuellement
            puis rfrenc de manire approprie. L'Editeur de Ressource TML ne
            fournit pas de signification directe d'dition de ressources Control
            List ou Control Template.

            La grande zone bleue au centre du dialogue est utilise pour
            reprsenter une chelle  50% du bureau du GS avec une fentre. La
            fentre reprsente l'emplacement et la taille de la fentre telle
            qu'elle est dfinie par la ressource fentre. Pour changer
            l'emplacement de la fentre, cliquer simplement dans le contenu de 
la
            surface de la fentre et dplacez-la. Pour changer la taille de la
            fentre cliquer dans la case de taille du coin infrieur droit de la
            fentre et dplacez-la. Le bouton Center peut tre utilis pour
            centrer rapidement la fentre sur le bureau. Les boutons radios des
            modes 640 et 320 sont utiliss pour informer l'Editeur de Ressource
            sur l'cran graphique  utiliser quand la fentre sera cre.
            L'Editeur de Ressource utilise ces informations pour calculer
            correctement l'chelle de la taille de la fentre dans le dialogue. 
            Le
            bouton frame (structure) est utilis pour afficher le dialogue de
            dfinition de la structure de la fentre et ses informations. Le
            bouton Controls est utilis pour demander le dialogue Content 
            Controls
            (controles intgrs) et crer les controles intgrs qui 
            appartiennent
             la fentre.

            ````Window Frame Definition:

            Le dialogue de dfinition de la structure est utilis pour
            dfinir les attributs de la strucutre de la fentre, taille zoom,
            taille des donnes contenues et les informations de la hauteur de la
            barre.

            La signification de chacun des attributs ressource est expliqu
            dans la table suivante:

            Attribut Signification

            Title bar mis si la fentre a une barre de titre
            Close box " " " une case de fermeture
            Alert frame type " " " devra tre dessine avec un
            style d'alerte au lieu de la strucure d'un
            document standard. Une strucure d'alerte est
            typiquement utilise pour les modals dialogs.
            Vertical scroll bar mis si la fentre a une barre de dfilement
            verticale
            Horizontal scroll bar " " " " " " horizontale
            Grow box mis si la fentre a une case de taille
            Zoom box " " " une case de zoom
            Moveable doit tre traite comme une
            rgion dplaable pour dplacer la fentre sur le
            bureau
            Quick in content mis si un clic dans une rgion contenue dans la
            fentre (pas en avant) slectionnera la fentre
            comme serait trait un clic dans le contenu.
            Visible mis si la fentre est visible quand elle est cre
            Information bar mis si la fentre a une barre d'information
            Zoomed " " " est initialement agrandie
            Zoom rect dfinit les coordonnes haut, gauche, bas et
            droite de la fentre quand elle est agrandie
            Data height/width dfinit la taille en pixels de la hauteur et
            largeur de la fentre
            Info height dfinit la hauteur de la barre d'information si la
            fentre en possde une

            ````Window Controls Definition:

            Le dialogue de controle de fentre est utilis pour dfinir les
            controles contenus dans la fentre. Les controles intgrs sont un
            simple bouton, une case de test, un bouton radio, une dition de
            ligne, une dition de texte, une case de taille, un texte statique,
            une image, un bouton icone, des ascenseurs, un menu pop-up, une 
            liste.
            Pour crer un nouveau controle, cliquer simplement sur la palette de
            controle dans la partie gauche de la case de dialogue pour le type 
de
            controle dsir puis cliquer  l'intrieur de la fentre  l'endroit
            o| le controle devra tre plac.

            ``CHAPITRE 5: MODE D'EMPLOI DE TML II

            ```LE MENU POMME:

            Contient une rubrique ABOUT donnant les rfrences et copyright
            de TML Pascal II.
            En dessous, se trouvent les NDA disponibles dans votre disquette
            de lancement.
            Ensuite, on trouve OPEN NDA si on vient de compiler en mmoire un
            accessoire de bureau. Cela permet de tester le programme NDA que 
vous
            venez de compiler.
            Si un accessoire de bureau vient d'tre compil, l'option
            REMOVENDA est galement prsente. Elle permet de librer la mmoire 
            du
            code compil de l'accessoire de bureau. De plus, aprs usage de 
cette
            option OPEN et REMOVE NDA disparaissent de ce menu.

            ```LE MENU FILE:

            Ce menu contient les options habituelles:

            NEW : crer une nouvelle fentre d'dition Source ou Resource. On
            peut ouvrir autant de fentre que la mmoire disponible le
            permet.
            OPEN : ouvrir un fichier Source ou Resource existant.
            CLOSE : fermer la fentre d'dition active. Si le fichier n'a pas
            t sauv, une alerte vous demande de confirmer.
            SAVE : sauver la fentre active avec son nom courant SAVE AS :
            sauver la fentre active en la renommant
            REVERT : remplacer les modifications apportes  la fentre 
d'dition
            active, par la dernire version sauve.
            PRINT OPTIONS: permet de configurer le Haut de Page pour 
l'impresion:
            prsence facultative du nom, de la date et du numro de page
            PAGE SETUP: permet de dfinir les commandes d'impression.
            Soit papier continu (listing) ou feuille  feuille (cut
            sheet). Avec l'option Continuous, l'en-tte est imprim
            uniquement sur la premire page et aucune ligne n'est saute
            en bas de page. Avec Cut Sheet, l'en-tte estimprim en haut
            de chaque page, en bas de page il y a saut de lignes et il
            faut spcifier le nombre de lignes  imprimer (dfaut: 8'1/2
            x 11'). Les commandes d'impression ditables permettent
            d'envoyer une commande AVANT l'impression (changement de
            fonte, style...). Les caractres de controle sont
            reprsents par * (attention: cette * est un accent
            circonflexe) suivi de la lettre reprsentant le caractre
            controle  envoyer. Par exemple, * [ va envoyer ASCII 27
            (caractre Escape). (attention: cette * est un accent
            circonflexe)
            PRINT : impression du fichier se trouvant dans la fentre active.
            Entapant OPTION lors du choix de cette commande, seul le
            texte slectionn sera imprim (texte en mode inverse).
            QUIT : quitter TML et revenir au Launcher. Une alerte vous demande
            de confirmer pour la sauvegarde des fichiers en cours
            d'dition.

            ```LE MENU EDIT:

            Les commandes traditionnelles:

            UNDO : annule la dernire opration d'dition effectue.
            CUT : transfrer une zone slectionne, dans le Presse-Papier
            COPY : dupliquer une zone slectionne, dans le Presse-Papier
            PASTE : coller le contenu du Presse-Papier  partir de la position
            du curseur
            CLEAR : effacer la zone slectionne
            SELECT ALL: slectionne tout le contenu de la fentre d'dition
            SET FONT-SIZE: permet de dfinir la forme et la taille de la fonte 
de
            la fentre d'dition ainsi que la largeur des tabulations.

            ```LE MENU SEARCH:

            FIND : affiche une fentre de dialogue o| l'on indique la chaine 
            rechercher  partir de la position actuelle du curseur (et
            non depuis le dbut du fichier).
            FIND NEXT: poursuit la recherche  partir de la position du curseur 
            de
            la chaine spcifie dans le dialogue 'Find'.
            FIND SELECTION: recherche  partir du curseur la position de la 
            chaine
            slectionne dans la fentre d'dition.
            REPLACE: affiche le menu de Remplacement permettant d'indiquer la
            chaine  chercher ( partir du curseur) et celle qui la
            remplacera.
            REPLACE SAME: poursuit le remplacement de la chaine indique dans la
            dialogue 'Remplacement'.
            GOTO SELECTION: fait dfiler le texte de manire  afficher la zone
            contenant le curseur

            ```LE MENU WINDOW:

            NEXT WINDOW: fait passer la fentre active en toute dernire 
            position.
            Ainsi la fentre suivante est alors place en premire
            position et devient active.
            GET INFO: affiche le prfixe d'accs du fichier actif, sa taille en
            octets et le nombre de lignes.
            LAST ERROR: affiche la fentre d'alerte contenant le dernier message
            d'erreur dtect par TML.

            ```LE MENU COMPILE:

            TO MEMORY: compile en mmoire le source de la fentre active. Si ce
            source est un programme, celui-ci est excut. Si le source
            est un NDA, l'option OPEN et REMOVE NDA est active dans le
            menu POMME. Si le source est une UNIT, celle-ci est
            simplement compile en mmoire.
            TO DISK : compile sur disque le source prsent dans la fentre 
            active.
            Si le fichier est un programme, TML gnre un fichier compil de 
type
            $B3, si le fichier est une unit, le code objt compil  son
            nom se terminant par '.p.o'.
            CHECK SYNTAX: vrifie si le source de la fentre active contient des
            erreurs de syntaxe.

            ADD RESOURCES: permet de lier le fichier principal avec un fichier
            resource prsent sur la disquette. Cette liaison permettra
            d'effectuer le collage des resources avec le programme lors
            des compilations.

            PREFERENCES: permet d'indiquer un certain nombre de parameters en
            standard.

            K-bytes symbol table: taille alloue pour la table des ymboles.
            Une telle table est une zone de donnes servant au
            compilateur pour y stocker les dclarations de labels,
            variables, tableaux, procdures et fonctions. Dans la
            majorit des cas, la taille standard de 12k est
            suffisante. Cependant si une erreur de type ERROR
            SYMBOL TABLE SPACE EXHAUSTED se produit, il faudra
            augmenter ce parameter (maxi 32K, mini 2K).

            K-byte Stack: les programmes TML ont besoin d'une pile
            d'excution. Valeur par dfaut: 8K; valeur mini: 1K et
            maxi: 32K. Cette option peut galement tre change par
            la directive $StackSize.

            Keyboard break: permet d'implmenter le CTRL-C. Si cette option
            est coche, TML gnre un code entre chaque instruction
            afin de dtecter si CTRL-C a t tap. On peut aussi
            utiliser la directive $KeyboardBreak pour activer
            l'option.

            Unit search path: permet d'indiquer  TML le prfixe d'accs des
            UNITS indiques dans les clausess USES. La valeur par
            dfaut est 1:TOOLINTERFACES: qui indique le dossier
            ToolInterface situ dans le dossier contenant le
            compilateur pascal.

            Auto save text: indique si on veut sauver automatiquement les
            sources lors de la compilation en mmoire. Ceci permet
            de conserver son source sur disque au cas o| un
            'incident' se produiraait lors de l'excution du code
            compil.

            Total system memory: indique la taille RAM maxi
            Free memory: indique la taille RAM disponible
            Largest memory block: la taille du plus large bloc disponible en
            mmoire

            OK : on accepte les parameters du menu prfrences (ou taper
            RETURN).
            CANCEL : on efface les parameters entrs et on rcupre les
            anciens.
            RELEASE MEMORY: purge les zones mmoires occupes par des codes
            compils.

            ```LE MENU GS OS:

            RENAME : permet de renommer un fichier se trouvant sur disquette.
            DELETE : permet d'effacer dfinitivemeent un fichier prsent sur
            disquette TRANSFER: permet de lancer une application sans
            revenir au Launcher.

            ``CHAPITRE 6: LES APPLICATIONS TEXTBOOK

            La programmation de l'Apple II GS peut parfois apparaitre
            dissuasive, intimidante. Pour cette raison, non seulement le
            compilateur Pascal TML a t ralis pour dvelopper des 
applications
            sur Apple II GS avec des accessoires de bureau qui utilisent
            l'interface "desktop" mais aussi pour fournir un environnement de
            programmation en Pascal plus traditionnel. C'est  dire la 
            possibilit
            d'crire des applications utiles sans avoir  s'occuper des 
fentres,
            Menus, controles, etc...

            Ce type d'application est appel une application "textbook". Les
            applications "plain vanilla" sont encore des applications autonomes
            GS/OS mais elles reprsentent le programme Pascal Standard le plus
            reprsentatif que l'on puisse trouver dans un ouvrage ou dans
            l'environnement informatique traditionnel. Ces programmes 
n'utilisent
            que peu ou prou la boite  outil du II GS et assurent donc la
            portabilit des programmes pour l'Apple II GS.

            Un programme "textbook" s'excute sur l'Apple II GS en mode
            super-haute dfinition 640. Le compilateur gnre le code qui
            initialise les outils de l'Apple II GS et cre une fentre unique 
sur
            l'cran qui permettra l'affichage standard en 20 lignes et 80
            colonnes. A l'intrieur de cette fentre vous pourrez utiliser les
            procedures Pascal standard READLN et WRITELN, et parce qu'il s'agit
            d'une fentre Apple II GS vous pourrez galement utiliser le 
            graphisme
            QUICKDRAW.

            La programmation "textbook" est particulirement utile aux
            programmeurs dbutants du langage Pascal qui par consquent sont  
la
            dcouverte des possibilits fascinantes de l'Apple II GS. Les
            programmeurs expriments apprcieront aussi cette possibilit du
            Pascal TML aussi bien pour la construction "vite faite" d'outils ou
            pour tester une nouvelle portion de code sans avoir  rentrer dans 
            les
            dtails de l'utilisation des outils de l'Apple II GS.

            La structure d'un programme "textbook" est trs simple et
            rigoureuse.

            Le premier programme exemple FIRSTPROG est un programme
            "textbook".

            PROGRAM FirstProg;
            BEGIN
            Writeln('Hello World');
            Readln;
            End.

            ``CHAPITRE 7: LES APPLICATIONS GRAPHIQUES TEXTBOOK

            Parceque les programmes 'textbook' tournent actuellement dans le
            mode super-haute-rsolution de l'Apple II GS en utilisant QUICKDRAW,
            il est possible d'utiliser les fonctions graphiques de QUICKDRAW 
dans
            vos programmes 'textbook'.

            La dfinition de tels programme se fait au moyen de la procdure
            Graphics qui initialise le bureau du GS  l'aide de Quickdraw et
            spcifie le mode de rsolution 320 ou 640. Le bureau ainsi prpar 
            n'a
            ni barre de menu ni fentre. Par exemple:

            PROCEDURE Graphics(screenMode: Integer);

            Voici la transformation de notre prcdent exemple en application
            graphique:

            PROGRAM HelloWorld;
            BEGIN
            Graphics(640);
            WriteLn('Hello world');
            ReadLn;
            END.

            Pour utiliser QuickDraw il faut bien entendu inclure le nom de ce
            module dans la clause USES de votre programme. Quand votre programme
            se lance, QuickDraw a dj t initialis et il est pret  l'emploi.
            De plus, l'Event Manager est galement disponible et la souris
            active.

            Par exemple:

            PROGRAM GraphicHelloWold;

            USES Types,
            QuickDraw;

            VAR aRect: Rect;

            BEGIN
            Graphics(320);
            SetRect(aRect,10,10,30,40);
            FrameRect(aRect);

            OffsetRect(aRect,25,30);
            FrameOval(aRect);

            OffsetRect(aRect,25,30);
            FrameRRect(aRect,20,20);

            MoveTo(50,30);
            DrawString('HelloWorld');

            END.

            Sur la disquette TML se trouve un exemple d'application graphique
            textbook nomme Graphics.p.

            ``CHAPITRE 8: LES APPLICATIONS DESKTOP

            Ce chapitre donne les grandes lignes de l'accs au Pascal TML et
             l'emploi du 'Toolbox' (boite  outils) de l'Apple II GS ce qui
            naturellement est la base pour la gestion des vnements, les
            applications bases sur le presse-papier et les accessoires de 
            bureau.
            La boite  outils est un ensemble important de logiciels organiss 
en
            plusieurs sous-ensembles selon leur fonction appels 'Tool Set'
            (outils) ou 'Managers' (gestionnaires). A l'intrieur de chaque 
outil
            se trouve un ensemble de routines ncessaires  la fonction de
            l'outil. A chacun des outils est attribu un numro d'outil qui lui
            est propre et  chacune de ses routines est attribu un numro de
            fonction particulier.

            Le Pascal TML permet l'accs  la Boite  outils de l'Apple II GS
            grace  un ensemble de modules Pascal. Dans un module on trouve des
            Constantes, des Types, des Procdures et des Fonctions qui
            correspondent  une ou plusieurs des routines 'outil' de l'Apple II
            GS. Ainsi, chaque fois qu'une application ncessite l'accs  une
            partie de la boite  outils, elle doit prciser le nom du module
            Pascal dans la clause USES qui dfini le lien avec les routines de 
la
            boite  outils. Ces modules Pascal se trouvent dans le rpertoire
            TOOLINTF/ de la disquette de distribution Pascal. Par exemple, la
            clause USES suivante rend l'outil 'QuickDraw II' disponible :

            USES QuickDraw;

            ```LES OUTILS DE L'APPLE II GS

            Avec la version Systme 5.0 minimum du II GS, 30 outils
            diffrents ont t dfinis en tant que sous-ensembles de la boite 
            outils. Chacun d'entre eux est list dans la table ci-dessous avec 
le
            module Pascal qui dfini son interfaage. Il est prcis en outre si
            celui-ci rside en ROM dans le II GS ou sur disquette comme un 
            fichier
            outil et qui doit alors tre charg en RAM avant d'tre utilis. Si 
            un
            outil doit rsider en RAM alors son fichier outil correspondant doit
            tre disponible dans le rpertoire SYSTEM/TOOLS/ de la disquette
            d'amorage. Le nom d'un fichier outil est TOOLxxx o| xxx reprsente 
            un
            nombre de trois chiffres correspondant au numro d'outil attribu. 
            Par
            exemple, le fichier outil du gestionnaire d'cran a le nom : 
TOOL014.

            N[ Outil Nom d'outil Module Pascal RAM ROM

            1 Tool locator Locator.p X
            2 Memory Manager Memory.p X
            3 Miscellaneous Tools MiscTool.p X
            4 QuickDraw II QuickDraw.p X
            5 Desk Manager Desk.p X
            6 Event Manager Event.p X
            7 Scheduler Scheduler.p X
            8 Sound Manager Sound.p X
            9 Apple Desktop Bus ADB.p X
            10 SANE SANE.p X
            11 Integer Math IntMath.p X
            12 Text Tools TextTool.p X
            13 rserv au systme
            14 Window Manager Windows.p X
            15 Menu Manager Menus.p X
            16 Control Manager Controls.p X
            17 System Loader Loader.p X
            18 QuickDraw Aux Rout QDAux.p X
            19 Print Manager Print.p X
            20 Line Edit LineEdit.p X
            21 Dialog Manager Dialogs.p X
            22 Scrap Manager Scrap.p X
            23 Standard File StdFile.p X
            24 Disk Utilities n/a X
            25 Note Synthesizer NoteSyn.p X
            26 Note Sequencer NoteSeq.p X
            27 Font Manager Fonts.p X
            28 List Manager Lists.p X
            29 Audio Comp-Expan. ACE.p X
            30 Resource Manager Resources.p X
            32 MIDI MIDI.p X
            34 TextEdit Manager TextEdit.p X

            ```QUE FONT CES OUTILS ?

            Le paragraphe suivant expose bivement la fonctionnalit de
            chacun des outils de l'Apple II GS. Ce synoptique se veut une brve
            introduction  chacun des outils et vous devrez consulter les 
volumes
            1,2 et 3 de Apple II GS ToolBox Reference pour en savoir davantage.

            ````Les 7 outils de base:

            TOOL LOCATOR

            Le localisateur d'outil est le plus important. Sans cet outil il
            serait impossible d'accder aux autres outils. Le localisateur 
            d'outil
            vous permet de charger en RAM les outils  partir de la disquette et
            de les solliciter comme nous l'avons vu sans savoir en quel
            emplacement de la mmoire ils sont rangs.

            MEMORY MANAGER

            C'est le plus important aprs le Tool Locator. Cet outil est
            entirement responsable de l'allocation, dsallocation et
            repositionnement des blocs mmoires de l'Apple II GS. Il garde en
            mmoire le volume mmoire disponible et quelle partie est alloue et 
            
            qui.

            MISCELLANEOUS-TOOLS

            Il est essentiellement constitu de routines systmes qui doivent
            tre disponibles pour la plupart des autres outils.

            QUICKDRAW

            C'est l'outil qui controle l'environnement graphique de l'Apple
            II GS et trace des objets simples et du texte. Tous les autres 
outils
            qui crent des objets graphiques comme le gestionnaire de fentre,
            font appel  lui.

            QUICKDRAW AUXILIAIRE

            Cet outil contient des routines supplmentaires qui compltent
            l'outil QuickDraw de la ROM.

            EVENT MANAGER

            Le gestionnaire d'vnements permet aux applications de controler
            et de ragir  une action de l'utilisateur comme les actions sur la
            souris ou le clavier.

            RESOURCE MANAGER

            Il est responsable de la manipulation des donnes resources d'un
            fichier GS/OS.

            ````Les outils d'interfaage Desktop

            CONTROL MANAGER

            Il est constitu de toutes les routines ncessaires  la
            manipulation des controles. Les controles tant ces choses comme les
            barres droulantes, les ascenseurs, les boites de vrifications,
            etc...

            DESK MANAGER

            Cet outil rend une application capable de supporter les
            accessoires de bureau,  la fois les accessoires de bureau 
classiques
            et les nouveaux accessoires de bureau.

            DIALOG MANAGER

            Il fournit les routines qui permettent  une application de crer
            et d'utiliser des boites de dialogue et d'alerte pour assurer une
            communication entre un utilisateur et votre programme.

            FONT MANAGER

            C'est l'outil qui permet  votre application d'utiliser
            diffrentes polices de caractres ou des styles diffrents.

            LINE EDIT

            Il permet  un programme de prsenter du texte  l'cran et 
            l'utilisateur d'diter ce texte.

            LIST MANAGER

            Il est utilis pour crer les listes qui sont utilises 
            l'affichage rsultant de la slection sur un montant ou sur une 
            donne
            du mme genre.

            MENU MANAGER

            Il controle et permet l'utilisation des menus droulant et
            exploite les choix d'une application.

            SCRAP MANAGER

            Complte le 'brouillon' du bureau en ajoutant le couper, copie et
            coller  une application.

            TEXTEDIT MANAGER

            Il implmente un diteur de texte acceptant les changements de
            fontes et de style.

            WINDOW MANAGER

            Il cre l'environnement Bureau et il est responsable de la
            cration et de la manipulation des fentres.

            ````Les outils de gestion de priphriques

            APPLE DESKTOP BUS

            Cet outil est une mthode et un protocole pour connecter des
            quipements en entre, comme des claviers et des souris, avec 
l'Apple
            II GS. Les routines de cet outil sont utilises pour mettre des
            commandes et des donnes entre le microcontrolleur de Apple Desktop
            Bus et le reste du systme.

            PRINT MANAGER

            Il permet  une application d'utiliser les routines QuickDraw
            pour imprimer du texte et du graphique sur l'imagewriter ou la
            Laserwriter.

            STANDARD FILE

            Complte l'interface utilisateur pour spcifier un fichier 
            ouvrir ou  sauvegarder.

            TEXT TOOLS

            Cet outil assure le lien entre les drivers d'quipement en
            matire de caractres, qui doivent tre excuts en mode mulation, 
            et
            les applications tournant en mode natif.

            ````Les outils grant le systme

            SCHEDULER

            Le planificateur retarde l'activation d'un accessoire de bureau
            ou d'une autre tache jusqu' ce que les ressources ncessaires 
soient
            devenues disponibles.

            SYSTEM LOADER

            Il est responsable du chargement et du relogement du code, commme
            celui des applications ou des accessoires de bureau, en mmoire.

            ````Les outils sonores

            SOUND MANAGER

            Cet outil permet d'accder  l'lectronique du son de l'Apple II
            GS pour crer des sons de base.

            NOTE SYNTHESIZER

            Utilis pour crer des sons musicaux complexes en utilisant
            l'lectronique musicale de l'Apple II GS.

            NOTE SEQUENCER

            Sert  lier des notes du Note Synthetizer en squences, motifs et
            phrases constituant un son.

            ACE

            Permet de compresser/dcompresser les sons digitaliss afin de
            rduire leur encombrement sur disque.

            MIDI

            Permet de lier le GS avec un instrument  la norme MIDI via un
            des ports srie.

            ````Les outils mathmatiques

            INTEGER MATH

            Cet outil est constitu de l'ensemble des oprations utilises
            sur des entiers. Ceci inclus multiplication, division, conversions,
            etc...

            SANE

            Cet outil complte l'environnement numrique standard Apple. Il
            donne une prcision tendue IEEE 754 et 854 constituant un plus 
            l'arithmtique en virgule flottante.

            ```COMMENT S'OPERE L'APPEL D'UNE ROUTINE OUTIL

            Cette section est destine aux programmeurs expriments qui
            veulent comprendre comment une routine outil est actuellement 
appele
             partir de Pascal. Si vous vous contentez du fait que tout 
            fonctionne
            et que les routines sont des sous-programmes supplmentaires 
internes
            vous pouvez sauter cette section.

            Comme prcis plus haut, le Pascal TML permet l'accs  la boite
             outils de l'Apple II GS grace  un ensemble de modules Pascal qui
            dfinissent en Pascal le lien appropri  chacune des routines d'un
            outil particulier. Chaque routine outil est dfinie comme une
            procdure ou une fonction selon qu'elle retourne ou non une valeur
            dans la pile et peut avoir zro ou davantage de parameters.
            Finallement, la dclaration de procdure ou de fonction est 
complte
            avec l'instruction Tool (Tool Directive  voir dans le chapitre 7 du
            manuel de rfrence). L'instruction Tool est une extension
            particulire au Pascal TML pour l'Apple II GS dans le but de dfinir
            les liens avec la boite  outils. La dclaration de procdure 
            suivante
            est extraite du module QUICKDRAW.P et c'est le lien avec la 
procdure
            MoveTo de l'outil QuickDraw.

            PROCEDURE MoveTo(h,v:integer); Tool 4,58;

            Comme vous pouvez le voir, la dclaration de procedure est
            complte d'une instruction Tool 4,58. Le premier entier de
            l'instruction tool spcifie l'outil (toolset) auquel appartient la
            routine. Dans ce cas c'est l'outil numro 4 qui est Quickdraw. Le
            second entier est le numro de fonction de la routine de l'outil.
            Chaque routine d'un outil a son numro de fonction particulier. La
            routine MoveTo s'est vu attribuer le numro 58. Ensemble, ces deux
            entiers permettent d'identifier une unique procedure dans la boite 
            outils complte.

            L'Apple II GS dfinit un processus pour activer une routine du
            ToolBox. Pour appeler une routine, de l'espace pour les rsultats de
            fonctions doit d'abord tre rserv sur la pile suivi de 
            l'entassement
            des valeurs des parameters. Alors le registre X du 65816 doit tre
            charg avec le numro de fonction de la routine outil et le numro 
de
            l'outil de telle sorte que le registre X contienne : 256 * numro de
            fonction + numro d'outil. Finallement un grand saut  un
            sous-programme est fait  l'adresse $E10000 qui contient alors un 
            saut
            dans le 'tool locator' (localisateur d'outil) qui trouve le code
            associ  la routine outil dsire et lui passe le controle. Au 
            retour
            de la routine outil tous les parameters ont t enlevs de la pile
            laissant ventuellement la valeur rsultat au dessus de la pile. De
            plus le drapeau de report du 65816 est vraie et si une erreur se
            produit pendant l'excution de la routine outil alors l'accumulateur
            du 65816 contiendra un code d'erreur.

            En utilisant l'instruction Tool avec une dclaration de procdure
            ou de fonction et si les conventions prcdentes sont ralises 
alors
            le Pascal TML gnre une instruction de stockage de l'accumulateur
            dans la variable globale ToolErrorNum (voir chapitre 10 du manuel de
            rfrence) ainsi le code d'erreur potentielle retourn par une 
            routine
            outil peut tre examin. Ainsi l'instruction MoveTo(16,20) gnrera
            les instructions 65816 suivantes :

            pea $0010
            pea $0014
            ldx $3A04 ; 58 * 256+4
            jsl $E10000
            sta _ToolErr

            Afin de permettre aux programmes crits en TML Pascal d'effectuer
            des controles d'erreur  l'appel des routines outil, le Pascal TML a
            dfini une fonction spciale ISTOOLERROR qui examine l'tat du 
            drapeau
            de report du microprocesseur. La fonction IsToolError ne doit tre
            utilise qu'IMMEDIATEMENT aprs un appel  une routine outil pour 
            tre
            sur que l'tat du drapeau de report n'a pas t altr par une autre
            opration. Ainsi, un programme crit en Pascal TML pourrait utiliser
            le code suivant pour dtecter une erreur se produisant dans la 
            routine
            MoveTo :

            MoveTo(16,20);
            if IsToolError then
            Temp:= _ToolErr;
            Writeln('Erreur survenu en MoveTo, #',Temp);
            end;

            Remarquez que la valeur de _ToolErr a t sauvegarde dans la
            variable temporaire Temp avant l'appel  Writeln. Ceci parceque
            Writeln lui-mme fait appel aux outils ce qui detruirait la valeur 
de
            _ToolErr associe avec la condition d'erreur retourne par MoveTo.

            Il y a au moins trois cas o| le compilateur n'a pas besoin
            d'effectuer le stockage STA _ToolErr. Ce sont les suivants :

            (1) Beaucoup de routines outils ne renvoie pas d'erreur (ceci est le
            cas de l'exemple ci-dessus).

            (2) Une application qui a d'autres garanties que toutes les 
            conditions
            possibles d'erreur n'existent pas.

            (3) Une application qui ne serait pas affecte si une erreur
            survenait.

            Si ces raisons apparaissent souvent dans une application, alors
            la gnration de STA _ToolErr peut augmenter la dimension d'une
            application inutilement. Pour viter cela le Pascal TML dispose 
d'une
            instruction $ToolErrorChk pour viter ou ractiver la gnration du
            STA. (voir l'annexe B du manuel de rfrence).

            Par exemple, l'appel suivant  la routine MoveTo ne gnrera pas
            l'instruction STA ToolErrorNum :

            (*$ToolErrorChk-*)
            MoveTo(16,20);

            Alors que l'utilisation de l'instruction $ToolErrorChk peut
            conomiser une grande quantit de code, le programmeur doit tre 
trs
            prudent dans son emploie afin d'viter de tester la valeur du 
            _ToolErr
            alors qu'aucun code d'erreur ne sera affect  cette variable.

            ```GESTION DES INTERRUPTIONS (EVENEMENTS)

            Le concept de gestion des interruptions est un peu diffrent de
            ce que vous avez l'habitude de faire en programmation. La statgie
            habituelle et conventionnelle de la programmation d'une application
            consiste  laborer en squence des actions qui sont excutes l'une
            aprs l'autre. L'action 1 est excute d'abord, suivie par 
l'action2,
            puis l'action3 etc...
            La gestion d'vnements utilise une approche oppose. Toutes les
            actions sont possibles  un instant donn et l'action suivante 
dpend
            d'un vnement, gnrallement en rponse  une interaction de
            l'utilisateur dans le programme.

            La statgie tant donne, la structure de base de toutes les
            applications sur l'Apple II GS est presque toujours identique. Le
            programme principal est gnrallement constitu des dclarations
            suivantes :

            BEGIN
            StartUpGSTools;
            (* routines pour initialiser menus, fentres, etc... *)
            MainEventLoop;
            ShutDownGSTools;
            END.

            Les procdures StartUpGSTools et ShutDownGSTools sont
            responsables du chargement et de l'initialisation des outils de la
            boite  outils devant tre utiliss dans l'application et ensuite de
            les 'fermer' avant la fin du programme (voir Utilisation de la boite 
            
            outil de l'Apple II GS plus bas). La procdure MainEventLoop est
            responsable de la dtection des vnements et ensuite de la rponse
            aux vnements. La structure typique de cette procdure est la
            suivante :

            procedure MainEventLoop;
            var Event: EventRecord;
            code: integer;
            begin
            gMainEvent.wmTaskMask := $001FFFFF; (*permet  tache princ.
            de tout faire*)
            gDone := false;

            repeat
            code:=TaskMaster($FFFF, gMainEvent);
            case code of
            wInGoAway: DoClose;
            wInSpecial,
            wInMenuBar: HandleMenu;
            wInControl: DoControlHit;
            end;
            until gDone;

            end;

            ````Les vnements GetNextEvent possibles:

            nullEvent lorsqu'aucun vnement n'a eu lieu
            mouseDownEvt gnr lors d'un clic
            mouseUpEvt gnr lors de la fin de clic
            keydownEvt gnr lors de la frappe d'une touche
            autoKeyEvt gnr lors de l'enfoncement long d'une touche
            updateEvt vnement interne spcifiant que le contenu d'une
            fentre doit tre redessin (rafraichi).
            activateEvt vnement interne spcifiant qu'une fentre
            devient active ou inactive
            switchEvt gnr lorsqu'un controle switch est press
            deskAccEvt gnr lors de l'appel aux CDA
            driverEvt gnr lorsqu'un PostEvent est envoy par un
            priphrique (en gnral dbut ou arrt de
            transmission)
            app1Evt-app4Evt il peut y avoir 4 vnements dfinis par
            l'utilisateur et passs dans la queue d'vnements
            grace  PostEvent.

            ````Les vnements TaskMaster possibles:

            wInDesk vnement souris dans le bureau, hors de toute
            fentre
            wInMenuBar
            wInSpecial vnement souris dans la barre de menu avec
            relachement au dessus d'un item menu autre que NDA
            wInContent vnement souris dans la rgion Contenu d'une
            fentre
            wInDrag vnement souris dans la rgion Drag d'une fentre
            wInGrow vnement souris dans la case Grow d'une fentre
            wInGoAway vnement souris dans la case de fermeture d'une
            fentre
            wInZoom vnement souris dans la case Zoom d'une fentre
            wInInfo vnement souris dans la barre d'information d'une
            fentre
            wInFrame vnement souris dans le corps d'une fentre
            wInactMenu slection d'un item menu inactif
            wClosedNDA fermeture d'un NDA
            wCalledSysEdit appel de System Edit
            wTrackZoom vnement souris dans la case Zoom d'une fentre,
            mais la souris n'a pas t relache dans la case
            wHitFrame vnement souris dans le corps de la fentre
            active
            wInControl vnement souris dans une fentre et  l'intrieur
            d'un controle

            ```STRUCTURE D'UN PROGRAMME

            Le code source d'un programme peut, bien sur, tre organis en
            fonction des dsirs du programmeur. Cependant, les applications
            Desktop doivent respecter certaines contraintes. En effet, toute
            application Desktop doit commencer par initialiser ses outils, puis
            les variables globales, crer les menus et fentres, grer les
            vnements et finalement fermer les outils avant de quitter
            l'application.
            Voici un extrait du programme SKELETON.p faisant appel aux
            resources. Dans ce cas, la fonction StartupTools fais rfrence  la
            resource StartStop dfinissant les outils utiliss par 
l'application.
            Voir le chapitre 4 pour plus d'informations sur les resources.

            gMyMemoryID := MMStartUp;
            gStartStopRef :=
            StartupTools(gMyMemoryID,
            refIsResource,
            ref(kStartStopRefID));
            if _ToolErr = NoError then begin
            InitializeGlobals;
            SetUpMenus;
            SetUpWindows;
            InitCursor;
            MainEventLoop;
            end;
            ShutDownTools(refIsHandle,gStartStopRef);

            ````Ajout de resources:

            Comme on le voit dans l'exemple ci-dessus, les programmes TML
            peuvent utiliser les resources dfinies  l'aide de l'diteur
            appropri (voir chapitre 4). Lors de la compilation du programme, 
les
            resources doievent tre copies  la suite de l'application GS/OS. 
Le
            linker se charge de cette besogne en copiant le fichier resource
            spcifi dans le menu Add Resources, dans l'application compile.

            ````Procdures dfinies (DefProcs)

            Souvent, les routines de la boite  outils de l'Apple II GS
            doivent appeler une procdure qui fait partie de votre application.
            Ces types de procdures et parfois de fonctions se sont vues donner 
            le
            nom de Procdures dfinies en abrg DefProcs. La raison de ce nom
            vient de ce que ces routines sont gnrallement utilises pour
            permettre  l'application de produire une dfinition courante pour 
la
            gnration de quelques oprations. Par exemple, il y a les 
procdures
            de dfinition de menu qui permettent  une application de fournir 
des
            procedures de tracs pour reprsenter des menus, peut-tre un menu
            qui contiendrait une palette de couleurs  la place des rubriques
            habituelles. Comme vous pouviez vous y attendre, la boite  outils
            permet aussi les procdures dfinies de fentres, controles, listes,
            etc...
            Un autre composant de la boite  outils o| une application doit
            utiliser une procdure dfinie est la routine outil 'NewWindow' du
            gestionnaire de fentre. La routine 'NewWindow' n'a qu'un parameter
            d'enregistrement qui est : 'NewWindowParamBlk'. Cet enregistrement
            dfini toute l'information dont a besoin le gestionnaire de fentre
            pour tracer et entretenir la nouvelle fentre. Trois des champs de
            l'enregistrement ncessitent des procdures dfinies. 
            L'enregistrement
            Pascal suivant montre les champs de l'enregistrement
            'NewWindowParamBlk' qui exigent des procdures dfinies.


            NewWindowParamBlk =
            record
            ...
            wFrameDefProc : ProcPtr;
            wInfoDefProc : ProcPtr;
            wContDefProc : ProcPtr;
            ...
            end;

            La routine wContDefProc, par exemple, est appele par le
            gestionnaire de fentre si jamais il dtecte que l'affichage du
            contenu de la fentre doit tre mis  jour du fait qu'une partie de 
            la
            fentre, qui tait prcdemment cache, devient visible.

            Lorsqu'on utilise galement NewWindow2, il y a lieu de faire
            appel  des procdures dfinies puisque l'un des parameters de la
            fonction s'appelle WINDOW'S CONTENT DEFINITION PROCEDURE.
            La routine Content defProc est appele par le Window Manager
            lorsqu'il dtermine que le contenu d'une fentre doit tre mis  
jour
            (redessin) du fait de la visibilit d'une rgion de la fentre
            pralablement masque.

            Comme vous pouviez le deviner, les conventions d'appel de
            procdure de la boite  outils pour une procdure dfinie ne sont 
pas
            les mmes que pour les procdures Pascal normales. Par consquent, 
il
            est ncessaire pour une application de signaler au compilateur du
            Pascal TML qu'une procdure particulire est en fait une procdure
            dfinie et qu'il doit utiliser les conventions d'appel des routines 
            de
            la boite  outils. Pour accomplir ceci, l'instruction de compilation
            suivante est utilise : $DefProc. L'instruction doit apparaitre
            immdiatement avant chacune des procdures qui sont des procdures
            dfinies.

            Il y a une observation qui doit encore tre faite concernant les
            procdures dfinies : l'adressage des variables globales. 
            Typiquement,
            les variables globales sont adresses en utilisant le mode 
            d'adressage
            absolu du 65816 plutot que le mode d'adressage absolu long moins
            efficace car le Pascal TML s'assure que le registre de la banque de
            donnes pointe sur la banque de mmoire contenant les variables
            globales du programme. Cependant, dans le cas de procdures 
dfinies,
            la convention du Pascal TML peut ne pas obir  une routine
            particulire de la boite  outils (par exemple la routine de la 
boite
             outil a chang la valeur du registre de la banque de donnes). 
            Aussi
            il est ncessaire de forcer le Pascal TML  utiliser le mode
            d'adressage absolu long pour les variables globales dans une 
            procdure
            dfinie pour s'assurer qu'elles sont correctement rfrences.

            exemple:

            (*$DefProc*)
            PROCEDURE WindowContentDraw;

            BEGIN
            ....
            END.

            ````Les grands programmes et la segmentation

            L'Apple II GS limite la dimension du code d'un programme et des
            segments de donnes  64 Ko. Les segments de code contiennent le 
code
            de l'application, tandis que le segment de donnes contient l'espace
            ncessaire aux variables globales de l'application. La raison de 
            cette
            restriction est qu'un segment ne doit pas franchir la limite d'une
            banque de mmoire. Sur l'Apple II GS, une banque de mmoire est de
            64ko. Aussi, pour dvelopper des applications ayant plus de 64 Ko de
            code ou de donnes, le programme doit-il tre segment. 
Normallement,
            Le Pascal TML cre un segment code et un segment donnes pour une
            application. Pour obtenir plus d'un segment, les instructions de
            compilation $CSeg et $DSeg doivent tre utilises.

            `````Segmentation du code:

            Les segments de code sont baptiss pour que l'diteur de liens
            puisse organiser les diffrentes parties du code ensemble en se 
            basant
            sur leur nom de segment. Le nom de segment code par dfaut est MAIN.
            Pour changer le nom du segment code en cours, l'instruction de
            compilation du Pascal TML (*$CSeg segname *) est utilise. Quand 
            cette
            instruction apparait dans un programme ou dans un module, le code de
            toutes les procedures et fonctions qui suivent est plac dans le
            nouveau segment code. Pour ramener le code de la segmentation au
            segment par dfaut mettez l'instruction (*$CSeg Main *) dans votre
            programme.

            Pour plus de dtails concernant l'emploi de l'instruction de
            compilation (*$CSeg segname*) voir annexes B et C du manuel de
            rfrence.

            `````Segmentation des donnes:

            Les segments de donnes sont baptiss comme les segments de code
            pour que l'diteur de liens puisse organiser les donnes ensembles 
en
            se basant sur leur nom. Le nom de segment de donnes par dfaut est
            -global. Pour changer le nom on utilise l'instruction de compilation
            (*$DSeg segname*). A moins qu'un programme ait absolument besoin 
            d'une
            grande place de mmoire pour ses variables globales l'instruction de
            compilation prcite ne devrait pas tre utilise car l'accs est
            moins efficace.

            Voir les annexes B et C du manuel de rfrence pour plus de dtails
            sur (*$Dseg segname*).

            ``CHAPITRE 9: LES NDA

            Les accessoires de bureau NDA sont des 'mini-applications' qui
            peuvent tourner  l'intrieur des applications Apple II GS. Il y a
            actuellement deux sortes d'accessoires de bureau : le type
            d'accessoires de bureau classique et les nouveaux accessoires de
            bureau.

            Les accessoires du nouveau bureau (NDA) sont destins 
            s'excuter en environnement bureau et gestion d'vnements. Un NDA
            tourne dans une fentre et prend le controle quand cette fentre est
            la plus frontale du bureau. Les accessoires du nouveau bureau sont
            rendus disponibles, par les applications qui travaillent avec, par
            l'intermdiaire du menu Pomme. Le Pascal TML fournit les outils pour
            complter les nouveaux accessoires de bureau en Pascal et c'est
            l'objet de ce chapitre.

            ```DEMARRONS

            Puisque les NDA oprent en environnement bureau vous devez vous
            assurer que les outils suivants ont bien t chargs et initialiss 
:

            QuickDraw
            Event Manager
            Window Manager
            Menu Manager
            Control Manager
            Scrap Manager
            LineEdit
            Dialog Manager

            D'autres outils peuvent aussi tre disponibles, mais vous ne
            pouvez pas savoir s'ils ont t chargs et initialiss. Si un nouvel
            accessoire de bureau a besoin d'autres outils il doit en assurer le
            chargement et l'initialisation lui-mme.

            ```LE FICHIER SOURCE

            Le code source d'un nouvel accessoire de bureau est tout  fait
            diffrent de celui d'un programme normal. En particulier, un NDA n'a
            pas de partie principale mais contient par contre quatre procdures
            particulires:

            DAOpen, DAClose, DAAction et DAInit.

            En plus de ces quatres procdures ncessaires, trois lments
            d'informations supplmentaires sont exigs : la priodicit, le 
            masque
            d'vnement et son nom de menu. Ces informations sont prcises en
            Pascal TML avec l'instruction de compilation $DeskAcc.

            (*$NDA period eventmask menuName *)

            La priodicit prcise la frquence d'appel du NDA par DARun pour
            rendre le NDA fonctionnel. Une priode de 1 reprsente 1/60 me de
            seconde, une priode de 2 reprsente 1/30 me de seconde, etc. . ..
            Une priode de $FFFF est jamais. Si un NDA affiche l'heure alors il
            faut une priode de 60 pour faire une mise  jour par seconde.

            Le masque d'vnement prcise quels vnements sont manipuls
            par l'accessoire de bureau. Ces valeurs sont un sous-ensemble de
            celles l qui sont utilises par les applications de l'Apple II GS 
            qui
            utilise GetNextEvent ou TaskMaster et qui sont listes ci-dessous en
            faisant rfrence au module Events.p. Des 6 lists ci-dessous, la 
            mise
             jour et l'activation des vnements sont toujours transmis 
            l'accessoire de bureau sans s'occuper du masque d'vnement,
            cependant, les quatre types d'vnements restant doivent tre 
            prciss
            explicitement. Si tous les vnements doivent tre manipuls par
            l'accessoire de bureau alors un masque d'vnement de -1 (ou $FFFF)
            doit tre prcis.

            CONST MDownMask = 2;
            MUpMask = 4;
            KeyDownMask = 8;
            AutoKeyMask = 32;
            UpdateMask = 64;
            ActivMask =256;

            EveryEvent = -1; (* $FFFF*)

            Enfin, le nom de menu est le nom de l'accessoire qui devra
            apparaitre dans le menu Pomme d'une application travaillant avec des
            accessoires de bureau.

            Comme nous l'avons dit plus haut, cette information est spcifie
            avec l'instruction de compilation $NDA. Cette instruction doit tre 
            la
            premire ligne du programme avant mme le mot PROGRAM. Par exemple,
            l'instruction suivante spcifie une priode de 1 seconde et que tous
            les vnements seront manipuls par l'accessoire de bureau et que le
            nom de menu de cet accessoire est "Horloge".

            (*$NDA 60 -1 Horloge *)

            Les accessoires de bureau fonctionnent diffremment des
            applications normales en ce qui concerne l'adressage des variables
            globales. Le Pascal TML alloue l'emplacement mmoire ncessaire aux
            variables globales dans un segment de donnes. Un segment de donnes
            est charg en mmoire tout comme le code d'un accessoire de bureau 
            est
            charg en mmoire. Cependant le registre banque de donnes du 65816
            n'est pas pret pour pointer sur la banque de mmoire qui contient le
            segment de donnes des variables globales de notre accessoire de
            bureau. Comme le compilateur ne peut tre s|r de l'endroit o| les
            variables globales seront ranges, il doit toujours utiliser le mode
            d'adressage absolu long du 65816 pour faire rfrence aux variables
            globales. Comme ce n'est pas le cas habituel pour les programmes en
            Pascal TML, il faut le prciser au compilateur avec l'instruction
            $LongGlobals+

            A prsent nous en arrivons  la structure de base d'un nouvel
            accessoire de bureau crit en Pascal TML.

            (*$NDA 60 -1 Horloge *)

            UNIT MonHorlogeNDA;

            FUNCTION DAOpen:WindowPtr;
            PROCEDURE DAClose;
            PROCEDURE DAAction(Code: Integer; Param: LongInt);
            PROCEDURE DAInit(Code: Integer);

            IMPLEMENTATION

            FUNCTION DAOpen: windowPtr;
            BEGIN
            (* code pour DAOpen *)
            END;

            PROCEDURE DAClose;
            BEGIN
            (* code pour DAClose *)
            END;

            PROCEDURE DAAction(Code:integer; Param: Longint);
            BEGIN
            (* code pour DAAction *)
            END;

            PROCEDURE DAInit(Code:integer);
            BEGIN
            (* code pour DAInit *)
            END;

            END.

            ````La procdure DAInit

            La procdure DAInit est appele quand les routines DeskStartUp et
            DeskShutDown de l'outil Desk Manager sont appeles par l'application
            pour initialiser ou fermer tous les accessoires du nouveau bureau. 
La
            valeur du parameter code indique dans quelles circonstances la 
            routine
            a t appele. Si le code=0 DAInit a t appele pour une fermeture
            sinon pour une ouverture. Dans tous les cas, cette routine devra
            contenir le code ncessaire  l'initialisation et  la fermeture de
            l'accessoire de bureau.

            PROCEDURE DAInit(code:integer);
            (* la variable myWindOpen est globale *)
            BEGIN
            if code=0 then begin
            (* demande de fermeture, vrifier que la fentre DA est ferme *)
            end
            else begin
            (* initialisation *)
            myWindOpen:=false
            end
            END;

            La plupart des NDA sont ouvert en mme temps qu'une fentre est
            affiche 'fentre de l'application en cours). Le NDA doit vrifier 
si
            la fentre est ouverte ou non. La meilleure faon de procder 
            consiste
             employer une variable globale windOpen qui sera VRAIE lorsque la
            fentre est ouvert et FAUSSE autrment. Ainsi, lorsque DAInit est
            appel lors du DeskStartUp, il devra mettre la variable globale
            windOpen  FAUX.
            Il est possible que DAInit soit appelle pour se fermer  cause
            d'un DeskShutDown, alors que sa fentre est encore ouverte. Ceci 
peut
            se produire si un utilisateur quitte une applicatrion avec un NDA
            encore ouvert sur le bureau. Il est impratif que la procdure 
DAInit
            vrifie que la fentre est ferme avant de permettre la fin.

            ````La fonction DAOpen

            Cette fonction est appele comme le rsultat d'une application en
            appelant la routine OpenNDA de l'outil Desk Manager. Cette routine
            doit vrifier si l'accessoire de bureau a dja t ouvert et si oui
            sort sans rien faire. Sinon, la fonction devra crer la fentre de
            l'accessoire de bureau, lui faire un systme de fentre et renvoyer 
            le
            pointeur de fentre  la fentre cre comme un rsultat de fonction.

            Voici une partie de code qui montre la structure de base de
            DAOpen.

            FUNCTION DAOpen: windowPtr;
            (* les variables myWindOpen, myWindPtr, et myWind sont globales *)
            BEGIN
            if myWindOpen then SelectWindow(mywindPtr)

            else begin
            myWindOpen:=true;
            myWindPtr := NewWindow2(...);
            SetSysWindow(myWindPtr);
            end;
            DAOpen:=myWindPtr;
            END;

            ````La procdure DAClose

            La procdure DAClose devra fermer l'accessoire de bureau si
            celui-ci est ouvert. Il doit aussi travailler sans crer de 
situation
            d'erreur s'il est appel alors que l'accessoire de bureau n'est pas
            ouvert.


            PROCEDURE DAClose
            (* les variables myWindPtr et myWindOpen sont globales *)
            BEGIN
            if myWindOpen then begin
            CloseWindow(myWindPtr);
            myWindOpen:=false;
            end;
            END;

            ````La procdure DAAction

            La procdure DAAction est la routine qui fait tout le travail
            associ  l'accessoire de bureau depuis l'ouverture de celui-ci et
            jusqu' sa fermeture. La procdure DAAction a deux parameters : un
            code qui indique quel genre d'action faire et un parameter param 
dont
            la signification dpend en fait du parameter code. Il y a neuf 
            valeurs
            possibles pour le code, chacune devant pouvoir tre reconnue de la
            procdure DAAction. Ces actions sont numres dans la table 
suivante
            avec la signification du parameter param dans chaque cas.

            ACTION DESCRIPTION

            DAEvent Un vnement relevant de l'accessoire de bureau s'est
            produit, param pointe sur l'enregistrement le
            dcrivant.
            DARun La dure de la priode prcise a expire. Param non
            significatif
            DACursor Ce code est transmis  l'accessoire de bureau, si
            celui-ci est sur le devant de l'cran, chaque fois que
            SystemTask est appel. Le but est de permettre 
            l'accessoire de bureau de changer le curseur quand il
            est sur la fentre du NDA. Param non significatif
            DAMenu Ceci est transmis  un accessoire de bureau si une
            rubrique d'un menu est slectionne. LoWrd(param) est
            l'identifiant du menu et HiWrd(param) est l'identifiant
            de la rubrique.
            DAUndo Chacun des 5 codes suivants sont transmis  un
            DACut accessoire de bureau si l'application dtermine que
            DACopy l'utilisateur a slectionn l'une de ces commandes
            DAPaste d'dition dans le menu Edition. La pro-
            DAClear cdure DAAction attribuera la valeur 1 au parameter
            code si l'action a eu lieu, sinon la valeur 0 sera
            attribue.

            La partie de code suivant montre la structure de base de DAAction

            PROCEDURE DAAction(Code : integer; Param: Longint);
            (* la variable myWindPtr est globale *)
            VAR currPort: GrafPtr;
            BEGIN
            case code of

            DAEvent:begin
            case EventRecordPtr(param)".what of le " est un accent circonflexe
            mousedownEvt:;
            mousUpEvt: ;
            keyDownEvt: ;
            autoKeyEvt: ;
            updateEvt: ;
            activateEvt: ;
            end;
            end;

            DARun: begin
            currPort := GetPort;
            SetPort(myWindPtr);
            SetPort(currPort);
            end;

            DACursor: begin
            (* code pour m.a.j. du curseur *)
            end;

            DAMenu : begin
            (* code pour rpondre  une slection dans un menu *)
            end;

            DAUndo : begin
            (* code pour produire un 'annuler' pour le DA *)
            code := 1;
            end;

            DACut : begin
            (* code pour un 'couper' pour le DA *)
            code := 1;
            end;

            DACopy : begin
            (* code pour un 'copier' pour le DA *)
            code := 1;
            end;

            DAPaste : begin
            (* code pour un 'coller' pour le DA *)
            code := 1;
            end;

            DAClear: begin
            (* code pour un 'effacer' pour le DA *)
            code := 1;
            end;
            end;
            END;

            ```LA COMPILATION D'UN NDA:

            Lors de la mise au point du NDA, la compilation en mmoire permet
            d'installer le NDA artificiellement dans le menu Pomme et de tester
            son fonctionnement. Lorsque le NDA est au point, procdez  une
            compilation sur disque.
            A prsent que vous avez cr avec succs un accessoire de bureau
            il doit tre convenablement install dans le rpertoire
            SYSTEM/DESK.ACCS/ de la disquette d'amorage pour que les 
            applications
            puissent y accder. L'installation d'un nouvel accessoire de bureau 
            se
            fait selon les trois tapes dcrites ci-dessous :

            (1) Les nouveaux accessoires de bureau sont des programmes (fichiers
             charger pour GS/OS) ayant pour type de fichier $B8.
            (2) L'outil Desk Manager de l'Apple II GS exige que tous les
            accessoires de bureau soient placs dans le rpertoire
            SYSTEM/DESK.ACCS/. Par consquent il est ncessaire de copier le
            fichier  charger de l'accessoire de bureau dans le rpertoire.
            (3) Enfin l'Apple II GS doit tre redmarr. Pendant ce redmarrage
            le rpertoire SYSTEM/DESK.ACCS/ est explor pour voir les
            accessoires actuellement installs. Comme cette exploration ne se
            fait qu'une fois lors du dmarrage il faut donc redmarrer pour
            que notre nouvel accessoire soit reconnu.

            ``CHAPITRE 10: LES CDA

            Les accessoires de bureau CDA sont des 'mini-applications' qui
            peuvent tourner  l'intrieur des applications Apple II GS. Les
            accessoires classiques de bureau (CDA) sont destins  s'excuter en
            environnement non-bureau et sans gestion d'vnements. Un CDA 
            s'active
             partir du Control Panel (Pomme-Ctrl-Esc).

            ```STRUCTURE DU PROGRAMME

            La structure d'un CDA est assez proche d'une application Texte
            normale, except qu'il n'y a pas de programme MAIN et qu'il y a deux
            routines spciales: starUpCDA et ShutDownCDA appeles directement 
par
            le DeskManager en temps opportun.
            De plus, le source doit commencer par la directive $CDA qui
            indique au compilateur que le source implmente un CDA. A la suite 
de
            la directive, on place le nom du CDA tel qu'il apparaitra dans le 
            menu
            Ctrl-Panel.

            (*$CDA menuName*)

            Cette directive doit se situer AVANT le mot rserv UNIT.

            Voici la strucutre complte d'un CDA:

            (*$CDA SHRDump*)
            UNIT MySHRDump;

            INTERFACE

            PROCEDURE StartUpCDA;
            PROCEDURE ShutDownCDA;

            IMPLEMENTATION

            PROCEDURE StratUpCDA;
            BEGIN
            (* code pour la routine *)
            END;

            PROCEDURE ShutDownCDA;
            BEGIN
            (* code pour la routine *)
            END;

            END.

            ````La procdure StartUpCDA:

            Cette procdure n'a aucun parameter et n'a aucune tache
            spcifique  accomplir. Le DeskManager appelle cette procdure 
            lorsque
            le nom du CDA est slectionn dans le menu Ctrl-Panel. Au contraire
            des NDA, les CDA ne gnrent pas d'vnements, aussi c'est  vous de
            grer entirement votre CDA.

            ````La fonction ShutDownCDA:

            Cette procdure n'a aucun parameter et n'a aucune tache
            spcifique  accomplir. Le DeskManager appelle cette procdure 
            lorsque
            DeskShutDown est invoqu par une application ou si on passe de P8 
            GS/OS.
            Cette fonction permet de conclure les vnements mis en route par
            la procdure StartUpCDA; mais comme en principe les CDA se quittent
            pour revenir dans une application, vous n'aurez pas  appeler cette
            fonction.

            ```COMPILER UN CDA:

            Lors de la mise au point du CDA, la compilation sur disque permet
            de compiler CDA. Au contraire de sNDA, on ne peut le compiler en
            mmoire pour le tester.
            A prsent que vous avez cr avec succs un accessoire de bureau
            il doit tre convenablement install dans le rpertoire
            SYSTEM/DESK.ACCS/ de la disquette d'amorage pour que les 
            applications
            puissent y accder. L'installation d'un accessoire de bureau 
            classique
            se fait selon les trois tapes dcrites ci-dessous :

            (1) Les ccessoires de bureau classiques sont des programmes 
(fichiers
             charger pour GS/OS) ayant pour type de fichier $B9.
            (2) L'outil Desk Manager de l'Apple II GS exige que tous les
            accessoires de bureau soient placs dans le rpertoire
            SYSTEM/DESK.ACCS/. Par consquent il est ncessaire de copier le
            fichier  charger de l'accessoire de bureau dans le rpertoire.
            (3) Enfin l'Apple II GS doit tre redmarr. Pendant ce redmarrage
            le rpertoire SYSTEM/DESK.ACCS/ est explor pour voir les
            accessoires actuellement installs. Comme cette exploration ne se
            fait qu'une fois lors du dmarrage il faut donc redmarrer pour
            que notre accessoire soit reconnu.

            ``CHAPITRE 11: MOTS RESERVES

            ```ELEMENTS DE BASE

            Les lments de base que nous allons voir se classent en
            "symboles spciaux", "identifiants", "instructions", "nombres non
            signs", "tiquettes" et "chaines de caractres". En dehors des
            chaines de caractres la reprsentation de n'importe quelle lettre
            (majuscule, miniature, police, etc...) n'est pas significative pour 
            le
            programme.

            Le texte d'un programme Pascal est constitu d'lments de base
            et de sparateurs, lequel est soit un blanc (caractre espace ou
            tabulation) ou un commentaire. Deux lments de base adjacents 
            doivent
            tre spars par un ou plusieurs sparateurs si chacun des lments
            est un identifiant, un nombre ou un mot-symbole.

            ```SYMBOLES SPECIAUX:

            Les symboles spciaux sont des lments qui ont une signification
            particulire et qui sont utiliss pour dlimiter les modules
            syntaxique du langage.

            Les caractres simples suivants sont des symboles spciaux:

            + - * / = < > . , ( ) : ; !  [ ]  
            !- accent circonflexe

            Les paires de caractres suivantes sont des symboles spciaux:

            <> <= >= := .. (* *)

            Les mots-symboles suivants (mots rservs) sont des symboles 
            spciaux:

            and array begin body
            case const div do
            downto else end file
            for function goto if
            implementation in interface label
            mod nil not of
            or otherwise packed procedure
            program record repeat set
            string then to type
            unit until uses var
            while with

            ```LES IDENTIFIANTS:

            Les identifiants servent  reprer les constantes, types,
            variables, procdures, fonctions, programmes, modules et champs dans
            les enregistrements. Un identifiant peut tre de n'importe quelle
            longueur s'il tient sur une seule ligne, cependant, seuls les 255
            premiers caractres sont significatifs. Majuscules et minuscules 
sont
            quivalants dans les identifiants. Aucun identifiant ne peut prendre
            le nom d'un mot rserv.

            identifiant !





            ! !


            ! ! ! !


            ! !


            !----! SOULIGNE !-! ! !


            !


            ! !


            !


            ! !


            ! !
            ! !


            !


            !



            Exemples d'identifiants standards du Pascal TML:

            Exit Maxint Writeln _DataInit A_very_long_identifiant

            ```LES DIRECTIVES:

            Les directives sont des identifiants qui ont une signification
            particulire dans le contexte d'une dclaration de procdure ou de
            fonction. Ils peuvent sinon tre utiliss comme identifiants dans 
            tous
            les autres contextes. Ce sont :

            EXTERNAL FORWARD INLINE TOOL

            (voir chapitre 17)

            ```LES NOMBRES:

            Les entiers non-signs en dcimal ou hexadcimal (en hxadcimal
            le caractre $ est utilis en prfixe) la notation reprsente des
            constantes de type de donnes "entier" ou "entier long". Les rels
            non-signs en notation dcimale reprsentent les constantes des
            donnes de type tendue. La lettre "E" ou "e" prcdant un facteur
            reprsente la puissance de dix.

            suite de chiffres 





            ! 


            !



            suite de chiffres Hex 





            ! 


            !



            signe 





            ! 


            ! 


            !---! - !--!




            Nombre non sign 





            ! 


            ! 


            !----! $ !-->! squence de chiffres Hex !






            Rel non sign



            -->! squence de chiffres !-->! . !-->! squence de chiffres !





            !





            !facteur !
            !d'chelle!







            !-->! inf !---->


            ! 


            Nombre de type Rel ! 





            ! ! ! 


            ! 


            !---->! signe !---! ! !-! squence !--! !



            !


            ! !


            ! 


            !->! squence !


            ! ! chiffres ! ! 


            ! 


            ! ! 


            ! ! 


            !










            Exemples de nombres :


            1 +100 -0.1 $A05D 5.329E4 NaN(1) Inf


            ```LES LABELS:

            Une tiquette est une suite de caractres dont la valeur est
            celle de n'importe quel entier entre 0 et 9999. Mettre des zros en
            tte d'tiquette ne modifie pas sa signification. 1 et 0001 sont
            quivalents. Les tiquettes sont utilises avec l'instruction GOTO 
            qui
            sera dcrite au chapitre 16.

            ```LES CHAINES DE CARACTERES:

            Une chaine de caractres est une suite de zro ou plusieurs
            caractres d'impression, tous sur la mme ligne d'un programme et
            encadrs d'apostrophes. Le nombre maximum de caractres dans une
            chaine est de 255. Une chaine de caractres n'ayant pas de caractre
            entre les apostrophes est appele une chaine vide.

            Une chaine de caractres reprsente une valeur de type chaine. En
            tant que type chaine, une chaine de caractres n'est pas seulement
            compatible avec d'autres types chaine mais aussi avec les types
            caractre et chaine compacte.

            Toutes les valeurs de type chaine ont un attribut longueur
            "length". Dans le cas d'une chaine de caractres, la longueur est
            fixe; elle est gale au nombre actuel de caractres de la chaine 
            l'intrieur des apostrophes. Une paire d'apostrophes adjacents 
            l'intrieur d'une chaine de caractres est considre comme une 
            simple
            apostrophe et donc compte comme un caractre simple dans la 
longueur
            de la chaine.

            Exemples de chaines caractres

            'A' ';' 'Pascal' 'Ceci est une chaine' 'L''image' '''' ''

            ```DECLARATIONS DE CONSTANTES:

            Une dclaration de constante dfinie un identifiant pour
            reprsenter une constante  l'intrieur du bloc qui contient la
            dclaration.

            dclaration de constante

            !





            !



            constante
            !





            ! ! ! !


            ! ! !


            ! !-! SIGNE ! 


            ! !


            ! !
            ! !


            !-> ! NOMBRE SIGNE ! 


            ! !


            ! !
            ! !


            !-> ! CHAINE CARACTERES ! 


            !



            Un nombre sign peut tre un entier ou un rel.

            ```COMMENTAIRES ET DIRECTIVES DE COMPILATION:

            les constructions:

            ( n'importe quel texte ne contenant pas de e accent grave )
            (* texte sans le couple astrisque et parenthse fermante *)

            sont appeles commentaires.

            Le remplacement d'un blanc par un commentaire ou un commentaire
            par un blanc ne modifie pas le sens d'un programme. Ceci tant, un
            commentaire, comme un sparateur, peut apparaitre n'importe o| dans 
            un
            programme l ou un blanc peut apparaitre.

            Les commentaires de la forme ... peuvent tre emboits avec les
            commentaires de la forme (*...*), et vice versa, cependant aucun 
            autre
            emboitement de commentaire n'est disponible. L'arrive d'un  dans 
un
            commentaire .. ou un *) dans un commentaire (*...*) termine 
            toujours
            le commentaire.

            Une directive de compilation est un commentaire qui contient le
            signe $ immdiatement aprs le  ou le (* qui commence le 
            commentaire.
            Le caractre $ est ensuite suivi par une ou plusieurs lettres qui
            reprsente une instruction de compilation prcise. Les directives de
            compilation servent  modifier le comportement du compilateur. 
            Chacune
            des instructions de compilation et leur effets sont dcrits en 
annexe
            B.

            Exemple d'instructions de compilation:

            $DefProc $LongGlobalst (*StackSize 10240*)

            ``CHAPITRE 12: BLOCS, VISIBILITE ET ACTIVATION




            ```DEFINITION D'UN BLOC:

            Le BLOC est le module de base d'un source Pascal. Il est
            constitu d'une partie dclaration et d'une partie instruction. La
            partie dclaration contient zro, une ou plusieurs dclarations qui
            peuvent apparaitrent dans n'importe quel ordre. La partie 
instruction
            est un arrangement d'instructions et elle suit la partie 
dclaration.
            Chaque bloc est une partie d'une procdure, d'une fonction, d'un
            programme ou d'un module (unit). Tous les identifiants et tiquettes
            qui sont dclars dans la partie dclaration d'un bloc sont dits
            locaux. Le bloc programme contient tous les autres blocs; par
            consquent, les dclarations dans le bloc programme sont dites
            globales.

            Bloc
            !





            ! ! !


            ! !


            !--! DECLARATION !<-!
            !



            Dclaration
            !





            ! !


            ! !
            ! !


            !


            ! !


            ! !
            ! !


            !


            ! !


            ! !
            ! !


            !


            ! !


            ! !
            ! !


            !


            !



            La partie dclaration d'tiquette dclare les tiquettes qui
            marquent des instructions dans la partie instruction correspondante.
            Chaque tiquette doit marquer exactement une instruction dans la
            partie instruction.










            ! --- !
            !


            ---

            La partie dclaration de constantes contient les dclarations de
            constantes locales  ce bloc. (voir "dclarations de constantes" au
            chapitre 11).










            ! !
            !




            La partie dclaration de type contient les dclarations de type
            locales  ce bloc. (voir chapitre 13)










            ! !
            !




            La partie dclaration de variables contient les dclarations de
            variables locales  ce bloc. (voir chapitre 10)










            ! !
            !




            La partie dclaration des procdures et fonctions contient les
            dclarations des procdures et fonctions locales  ce bloc.(voir
            chapitre 17)

            partie dclaration des procdures et fonctions

            !





            ! ! !


            ! ! ! !
            ! ! !


            ! !


            ! !


            !



            ```REGLES DE VISIBILITE:

            ````Visibilit d'une dclaration:

            L'apparition d'un identifiant ou d'une tiquette dans une
            dclaration dfinie l'identifiant ou l'tiquette, ceci tant,
            l'identifiant ou l'tiquette est associ  sa signification au point
            de dclaration. Toutes les autres occurences de cet identifiant ou
            tiquette doivent apparaitre dans la "visibilit" de cette
            dclaration. La "visibilit" d'une dclaration est le bloc qui
            contient la dclaration et tous les blocs qui lui sont inclus avec 
            les
            exceptions dcrites dans les paragraphes suivants.

            ````Redclaration dans un bloc inclus:

            Supposons que EXTERIEUR soit un bloc et que INTERIEUR soit un
            autre bloc dclar  l'intrieur de EXTERIEUR. Si un identifiant
            dclar dans le bloc EXTERIEUR a le mme nom qu'un identifiant 
            dclar
            dans le bloc INTERIEUR, alors le bloc INTERIEUR et tous ses blocs
            inclus sont exclus de la visibilit de la dclaration du bloc
            EXTERIEUR.

            ````Position des dclarations dans un bloc:

            La dclaration d'un identifiant ou d'une tiquette doit prcder
            les occurences de cet identifiant ou tiquette dans le texte du
            programme. C'est  dire que les identifiants et tiquettes ne 
peuvent
            pas tre utiliss tant qu'ils ne sont pas dclars. Il y a une
            exception  cette rgle: dans une dclaration de type, le type de
            domaine d'un type pointeur peut tre un identifiant qui n'a pas 
            encore
            t dclar. Dans ce cas, l'identifiant doit tre dclar quelque 
            part
            dans la mme dclaration que le type pointeur.

            ````Redclaration  l'intrieur d'un bloc:

            Un identifiant ou tiquette ne peuvent tre dclar plus d'une
            fois dans un bloc,  moins qu'il ne soit dclar  l'intrieur d'un
            bloc inclus ou encore s'il apparait dans la liste des champs d'une
            dclaration d'enregistrement.

            Un identifiant de champs d'enregistrement est dclar dans un
            type record (enregistrement). Il n'a de signification qu'en 
rfrence
             une variable de ce type enregistrement. Par consquent, un
            identifiant de champs peut tre dclar  l'intrieur d'un mme bloc
            contenant un autre identifiant de mme nom dans la mesure o| il n'a
            pas t prcdemment dclar dans la mme liste de champs. Un
            identifiant qui a t dclar peut tre rutilis comme identifiant 
            de
            champs dans un mme bloc.

            ````Identifiants d'objets standards:

            Le Pascal TML fourni un ensemble de constantes standards
            (prdclares), de types, procdures et fonctions qui se conduisent
            comme s'ils avaient t dclars dans un bloc qui contiendrait le
            programme entier. Leurs visibilits est le programme entier ou le
            module (voir chapitre 9 et 10, o| vous trouverez chacun des
            identifiants standards du Pascal TML).

            ````Visibilit des interfaces modules et identifiants de modules:

            Les programmes, Modules, spcifications de module, et corps de
            module contenant une clause USES se voient enrichis des identifiants
            appartenant  chacun des modules de la clause USES. Ces identifiants
            agissent comme s'ils avaient t dclars dans le mme bloc o| est
            apparue la clause USES.

            ```ACTIVATIONS:

            L'xcution d'un bloc fait dire de lui qu'il est en activation. A
            un moment donn, un bloc peut avoir zro, une ou plusieurs
            activations. Si un bloc n'est pas en train de s'xcuter il a alors
            zro activation. Si un bloc est en train de s'xcuter il a au moins
            une activation. Quand un bloc a plus d'une activation on dit qu'il 
            est
            rcursif.

            ``CHAPITRE 13: LES TYPES DES VARIABLES

            Quand vous dclarez une variable vous devez indiquez son type. Le
            type d'une variable dtermine l'ensemble des valeurs que la variable
            peut prendre et les oprations qui peuvent lui tre appliques. Une
            dclaration de type introduit un identifiant pour reprer un type.

            !





            !



            type
            !





            ! !


            ! !
            ! !


            !


            ! !


            ! !
            ! !


            !


            ! !


            ! !
            ! !


            !


            ! !


            ! !
            ! !


            !


            !



            Quand un identifiant apparait  la gauche d'une dclaration de
            type, il est dclar comme un identifiant de type pour le bloc dans
            lequel la dclaration de type a lieu. La visibilit d'un identifiant
            de type ne s'inclus pas d'elle mme, except pour les types 
            pointeurs.

            ```Les TYPES simples:

            Tous les types simples dfinissent un ensemble ordonn de
            valeurs.

            type simple
            !





            ! !


            ! !
            ! !


            !


            !



            Un identifiant de type entier est un des identifiants standards
            Integer ou LongInt. Un identifiant de type rel est un des
            identifiants standards Real, Single, Double, Comp ou Extended. Voir
            "Nombres" dans le chapitre 1 1ou comment reprer des constantes
            entires et les valeurs de type rel.

            ````Les TYPES ordinaux

            Les types ordinaux sont un sous-ensemble des types simples qui
            ont les caractristiques particulires suivantes :

            - les valeurs possibles d'un type ordinal sont un ensemble ordonn 
et
            chacune des valeurs a un numro d'ordre qui est une valeur entire.
            A l'exception des types entiers, la premire valeur de tous les
            types ordinaux est zro, la suivante a 1, etc.... Pour les types
            entiers, le numro d'ordre d'une valeur est la valeur elle-mme.
            Toutes les valeurs d'un type ordinal,  l'exception de la premire,
            ont un prdcesseur bas sur le numro d'ordre du type, et toutes
            les valeurs d'un type ordinal,  l'exception de la dernire, ont un
            successeur bas sur le numro d'ordre du type.
            - les fonctions standard ORD et ORD4 peuvent tre appliques 
            n'importe quelle valeur de type ordinal et elles renvoient le numro
            d'ordre de la valeur.
            - la fonction standard PRED peut tre applique  n'importe quelle
            valeur de type ordinal et elle renvoie le numro d'ordre de la
            valeur.
            - la fonction standard SUCC peut tre applique  n'importe quelle
            valeur de type ordinal et elle renvoie le numro d'ordre de la
            valeur.

            type nombre ordinal
            !





            ! !


            ! !
            ! !


            !


            ! !


            ! !
            ! !


            !


            !



            Le pascal TML a quatre types ordinaux prdfinis: Integer,
            LongInt, Boolean, et Char. De plus il y a deux classes pour la
            dfinition de types ordinaux par l'utilisateur: les types Enumrs 
et
            les types Intervals.

            ````Les TYPES ordinaux standards:

            Integer les valeurs du type entier sont un sous-ensemble de tous les
            nombres. Une variable de type entier peut avoir une valeur
            comprise dans l'interval -maxint-1 . . maxint, c'est  dire
            -32768  32767. La constante standard entire maxint est
            dfinie  32767.

            Longint les valeurs du type entier long sont aussi un sous-ensemble
            de tous les nombres. Une variable de type entier long peut
            avoir une valeur comprise dans l'interval -maxlongint-1 . .
            maxlongint. La constante standard maxlongint est dfinie  2
            147 483 647.
            Les oprations arithmtiques avec des oprandes de type
            entier utilisent une prcision entire (16 bits) ou entier
            long (32 bits) selon les rgles suivantes :

            - les constantes entires dans l'interval du type entier sont
            considres de type entier. Les autres constantes entires
            sont considres de type entier long.
            - si oprateur et oprande sont de type entier le rsultat sera
            de type entier (ventuellement tronqu  16 bits). De mme si
            les deux oprandes sont de type longint la prcision sur 32
            bits sera utilise et le rsultat sera de type longint.
            - Quand un oprande est de type longint et l'autre de type
            entier, l'oprande de type entier est d'abord converti en
            entier long et le rsultat est de type entier long.
            - l'expression situe du cot droit d'une instruction
            d'attribution est value indpendamment de la partie gauche.

            Une valeur entire peut tre explicitement convertie en
            entier long en utilisant la fonction stantard ORD4 dcrite au
            chapitre 20.

            Boolean Les valeurs du type boolen sont prcises par les
            identifiants de constantes prdfinies FALSE et TRUE, o|
            ord(false)=0 et ord(true)=1. Les valeurs de type boolen sont
            sollicites par les instructions pascal IF, REPEAT et WHILE.

            Char Le type caractre a un ensemble de valeurs qui est celui des
            caractres ASCII. L'appel de la fonction ord(ch), o| ch est
            une valeur caractre, retourne le numro d'ordre de ch. Une
            constante chaine de longueur 1 peut tre utilise pour
            prciser la valeur d'une constante de type caractre,
            n'importe quelle valeur de type caractre peut tre gnre
            par l'intermdiaire de la fonction CHR.


            ````TYPES numrs:

            Un type numr dfini un ensemble ordonn de valeurs par
            l'numration de la collection des identifiants qui reprent ces
            valeurs. L'ordre de ces valeurs est dtermin par la suite dans
            laquelle les identifiants sont lists. Par consquent pour deux
            identifiants numrs x et y, si x prcde y alors le numro d'ordre
            de x est infrieur  celui de y.

            type numr
            --- !





            --- !



            Quand un identifiant apparait  l'intrieur d'une liste
            d'identifiants d'un type numr, il est dclar comme constante 
pour
            le bloc dans lequel le type numr est dclar. Le type de cette
            constante est le type numr dans lequel il est dclar. Le numro
            d'ordre d'une constante numre est sa position dans la liste des
            identifiants sachant que le numro d'ordre de la premire constante
            numre est toujours 0.

            Exemples de types numrs:

            jour_ouvrable = (lundi,mardi,mercredi,jeudi,vendredi)
            couleur = (rouge,jaune,vert,bleue)

            Ici jaune est une constante numre de type couleur avec numro
            d'ordre 1, vendredi est une constante numre de type jour_ouvrable
            avec numro d'ordre 4, et ainsi de suite... et on a donc:

            ORD(lundi) < ORD(mardi)
            ORD(jeudi) > ORD(mardi)
            PRED(vert) = jaune
            SUCC(rouge)= jaune

            ````TYPES intervals:

            Un type interval dfini un sous-ensemble de valeurs d'un type
            ordinal appel le type hote. La dfinition d'un type interval 
            spcifie
            la valeur la plus petite et la plus grande de l'interval.

            type interval

            !





            !



            Les deux constantes d'un type interval doivent tre du mme type
            ordinal. Les types intervals de la forme a . . b exigent que a soit
            infrieur ou gal  b. Une variable de type interval possde toutes
            les proprits des variables de type hote, avec la restriction que 
sa
            valeur doit toujours tre l'une de celle de l'interval dfini par le
            type interval.

            Exemples de types intervals:

            1 . . 100
            -128 . . 127
            lundi . . jeudi

            ````Les TYPES rels




            Les types rels ont des ensembles de valeurs qui sont des
            sous-ensembles des nombres rels, lesquels peuvent tre reprsents 
            en
            notation virgule flottante en utilisant un nombre de digits 
            dtermin.
            En gnral, une notation virgule flottante d'une valeur n comprend 
un
            ensemble de trois valeurs m, b et e tel que m * (b  la puissance 
            e)=n
            , o| b est toujours 2 et m et e sont des valeurs entires dans
            l'interval des rels. Ces valeurs m et e dtermineront par la suite
            l'interval et la prcision des types rels.

            Il y a quatre types rels standards en Pascal TML: single,
            double, comp et extended. De plus l'identifiant standard real est
            dfinie comme tant quivalent au type extended. Les types rels se
            diffrencient par leur interval et la prcision des valeurs qu'ils
            reprsentent.

            Les types rels:

            Identifiant de type Occup. mmoire Interval

            Single 4 octets 1.4E-45  3.4E38
            Double 8 octets 5.0E-324  1.7E308
            Real, Extended 10 octets 1.9E-4951  1.1E4932
            Comp 8 octets -9.2E18  9.2E18

            Les valeurs possibles des rels sont:


            - des valeurs finies (un sous-ensemble des nombres rels). La
            valeur 0 a un signe associ (elle peut tre ngative ou
            positive)
            - des valeurs infinies, +INF et -INF rsultant de dpassement de
            capacit ou d'une division par zro.
            - NaN (Not a Number) reprsente le rsultat d'une opration
            n'ayant pas de reprsentation mathmatique (multiplier +- par 0
            par exemple). NaN est reprsent par NaN(x) o| x est un Integer
            dfinissant la source de NaN.

            Les rels sont implments dans TML II par l'outil SANE. Les
            oprations sur les rels sont galement possibles par l'emploi de
            l'interface SANE.P.

            Toutes les valeurs de type real sont converties en "extended"
            avant qu'une opration n'agisse sur elles, et le rsultat de ces
            oprations et toujours de type tendue. Une valeur tendue peut
            toujours tre utilise l o| une valeur "single, double ou comp" est
            demande,  condition que la valeur tombe dans l'interval
            correspondant.

            Toutes les valeurs de type rel sont converties en type tendue
            par le compilateur avant que les calculs ne soient ffectus afin
            d'obtenir une prcision maximum. En consquence, les calculs sur des
            donnes stockes selon le type tendue fourniront plus rapidement un
            code plus compact que les calculs sur des donnes stockes dans
            d'autres reprsentations. Les plus petites reprsentations devront
            tre utilises quand l'espace de stockage des donnes est plus
            critique que la vitesse d'excution.

            ```LES TYPES STRUCTURES:

            Un type structur est caractris par sa structure et par le(s)
            type(s) de ses composants. Le type d'un composant pouvant tre
            lui-mme structur. Il n'y a pas de limite inhrente au nombre de
            niveaux dans la structure.

            type structur

            !





            ! ! ! !


            ! 


            !->! COMPACTE !--! ! !


            ! 


            ! ! !


            ! ! !
            ! ! !


            ! !---> ! TYPE FICHIER ! 


            ! ! !


            ! ! !
            ! ! !


            ! !---> ! TYPE ENREGISTREMENT ! 


            ! !


            ! !


            !


            !



            L'utilisation du mot PACKED dans la dclaration d'un type
            structur indique que l'organisation du stockage de toutes les 
            valeurs
            de ce type sera la compression pour conomiser de la mmoire, mme 
si
            l'accs  un composant d'une variable de ce type est moins efficace.
            Notez que vous ne pouvez pas utiliser de composants de variables
            compactes comme variable actuelles paramtrant des procdures ou
            fonctions. Le compactage ne se fait qu'au niveau de l'octet, pas au
            niveau des bits. Voir galement l'appendix D.


            ````TYPES Tableaux:

            Un type tableau dfinie un type structur qui a un nombre de
            composants dtermins et qui sont tous du mme type.

            type tableau



            -->! ARRAY !-->! ( !-->! INDEX DE TYPE !-->! ) !-->! OF !-->! TYPE 
            !->



            ! !
            ! --- !
            !


            ---
            index de type
            !





            !



            Le type qui suit le mot OF est le type des composants du tableau.
            Le nombre des lments est dtermin par un ou plusieurs types 
index,
            un par dimension du tableau. Le type index doit tre un type 
ordinal.
            Il n'y a pas de limite au nombre de dimensions d'un tableau. 
            Cependant
            le pascal TML limite le tableau  32 767 octets.

            Un tableau de la forme

            packed array(1 . . n) of char

            est considr comme un type chaine compact. Un type chaine compact 
            a
            certaines proprits que ne partagent pas d'autres types de tableaux
            (voir les types identiques et compatibles plus loin dans ce 
chapitre)

            Exemples de types tableaux:

            array(1 . . 100) of real
            packed array (color) of boolean
            array (Boolean) of integer
            array(low..high) of boolean

            Si le type du composant d'un tableau est galement un tableau, le
            type rsultant est soit un tableau de tableaux soit un tableau
            multi-dimentionn. Par exemple:

            array(boolean) of array(0..maxsize) of real

            est quivalent 

            array(boolean, 0..maxsize) of real

            Le composant d'un tableau peut tre rcupr par l'emploi des
            index du composant  l'intrieur des crochets immdiatement aprs
            l'identifiant du tableau. On peut utiliser plusieurs ensembles de
            crochets. Par exemple:

            var anArray: array(1..maxlength,1..maxwidth) of real

            permet l'emploi de

            anAray(1,1) ou anArray(1)(1) pour accder au premier
            lment du premier sous-tableau.

            Remarquez que anArray(2) accde  la totalit du
            deuxime sous-tableau.


            ````Les TYPES "Enregistrement"

            Un type enregistrement est constitu d'une collection dtermine
            de composants appels champs, chacun d'eux pouvant tre de type
            diffrent. Pour chaque composant le type enregistrement prcise le
            type du champs et le nom de son identifiant.

            type enregistrement










            liste de champs
            !


            ! !
            !


            ----> ! PARTIE FIXE ! --> ! ; ! --> ! PARTIE VARIABLE ! -- ! ; ! -->
            ! !


            ! ! ! !
            !



            partie fixe
            !





            ! !


            ! --- !
            !


            ---
            dclaration de champs

            !





            !



            La partie fixe d'un type enregistrement donne la liste des champs
            qui sont toujours accessible par une variable de type enregistrement
            en donnant un identifiant et un type pour chaque champs. Chacun de 
            ces
            champs contient des donnes qui sont toujours accessibles de la mme
            manire.

            Exemple de type enregistrement:

            record
            anne : integer;
            mois : 1 . . 12;
            jour : 1 . . 31;
            end

            Une partie variable constitue de listes de champs "alternative"
            qui se voient allouer le mme espace mmoire qu'une variable
            enregistrement, ainsi les donnes situes dans cet emplacement 
seront
            accessibles de diverses manires. Chacune des listes est appele une
            variante. Les variantes se remplacent en mmoire et tous les champs 
            de
            toutes les variantes sont accessibles  tout moment.

            partie variante

            !


            ! !



            --->! CASE !--->! IDENTIFIANT !-->! : !-->! ETIQ DU CHAMP TYPE !---!



            !
            !


            !
            ! ---- !


            !--->! OF !---->! VARIANTE !


            --- ! !


            ! !
            ! --- !
            !


            ---
            variante

            !


            ---> ! CONSTANTE !--> ! : !---> ! ( !--> ! LIST CHAMPS !--> ! ) !-->
            !



            tiquette de champs type

            !





            !



            Chaque variante est introduite par une ou plusieurs constantes.
            Les constantes doivent tre distinctes et tre d'un type ordinal qui
            soit compatible avec l'tiquette champ du type. La partie variante
            permet un identifiant optionel qui annonce une tiquette de champs. 
            Si
            une tiquette champs est prsente, elle est considre comme un 
            champs
            de la prcdente partie fixe.

            Exemple de type enregistrement avec variantes:

            record
            nom, prnom : string(80);
            age : 0 . . 99;
            case married: boolean of
            true : (nom_de_jeune_fille:string(80));
            false:()
            end

            record
            x,y:real;
            case sorte: figure of
            rectangle:(hauteur,largeur:real);
            triangle: (cot1,cot2,angle:real);
            cercle : (rayon:real);
            end

            ````Les TYPES Ensembles:

            Un type ensemble a une gamme de valeurs qui peut atteindre celle
            d'un type ordinal appel alors type de base. Chacune des valeurs
            possibles d'un type ensemble est un sous-ensemble des valeurs
            possibles du type de base.

            type ensemble










            Le pascal TML limite le type de base  256 valeurs possibles. Si
            le type de base est un sous-ensemble d'entier il doit se limiter 
            0 .. 255. Pour plus d'informations concernant l'allocation mmoire 
et
            la reprsentation des donnes voir l'annexe C.

            Chaque type ensemble peut avoir la valeur () appele ensemble
            vide.

            Exemples d'ensembles:
            Set of Char
            Set of 0..31
            set of (rouge, vert, bleu)

            ````TYPES Fichier:

            Un type fichier est un type structur comportant une suite
            linaire de composants d'un mme type. Le type du composant peut 
tre
            de n'importe quel type qui ne soit pas un type fichier ou un type
            structur contenant un composant de type fichier. Le nombre de
            composants n'est pas prcis par la dclaration de type fichier.

            type fichier










            Le type fichier standard "text" est un fichier compact
            particulier de caractres, organis en lignes. Les fichiers de type
            texte sont manipuls par des procdures d'entres/sorties
            particulires expliques au chapitre 19.

            A cause de la reprsentation des types en TML Pascal, un fichier
            de caractres accde aux lments de fichier qui sont des mots de 16
            bits tandis que dans un fichier compact de caractres (ou texte) on
            accde  des lments de 8 bits. Pour plus de dtail voir l'annexe 
D.

            Exemples de types fichiers:

            IntFile = file of integer

            Le TML ne permet le passage de variables files dans les
            procedures ou fonctions que si elles sont des parameters.

            ```TYPES CHAINE:

            Une valeur d'un type chaine est une suite de caractres ayant un
            attribut longueur dynamique et un attribut 'constante' de dimension 
            de
            1  255. La constante de dimension est une limite maximum sur la
            longueur des valeurs de ce type. Si un attribut de dimension n'est 
            pas
            explicit celui-ci aura par dfaut la valeur 255.

            La valeur courante de l'attribut longueur d'une valeur de type
            chaine est retourne par la fonction standard 'length'. Une chaine
            vide est une valeur de type chaine ayant une longueur dynamique de
            zro.

            type chaine






            ! 


            ! ! !
            ! !


            ! !
            ! !


            !


            !



            dimension
            !





            !



            La relation d'ordre entre deux valeurs de chaine est dtermine
            par la comparaison des caractres dans les positions 
correspondantes.
            Quand les deux chaines sont de longueurs ingales, chaque caractre 
            de
            la chaine la plus longue ne peuvent correspondre  un caractre de 
la
            plus courte et  caractres communs gaux la plus longue sera
            considre de plus haute valeur. Ainsi 'attribut' est plus grand que
            'at'. Deux chaines doivent donc avoir la mme longueur pour pouvoir
            tre gales.

            Une chaine est stocke sous la forme un octet de longueur suivi
            des caractres de la chaine. On peut modifier la longueur d'une 
            chaine
            en modifiant directment son prmier octet:

            aString(0) := chr(5);

            Les oprateurs applicables aux chaines sont tudis au chapitre
            15; et les procdures et fonctions standard de manipulation de 
            chaines
            sont dcrites au chapitre 20.

            exemples:

            string(50)
            string(255)
            string

            ```TYPES POINTEUR:

            Un type pointeur dfini un ensemble de valeurs qui pointent sur
            des variables dynamiques d'un type spcial appel type de base. Une
            variable de type pointeur contient l'adresse en mmoire d'une 
            variable
            dynamique.

            type pointeur
            --- !





            --- !


            (attention cette * est un accent circonflexe )

            Si le type de base est un identifiant non dclar, il doit tre
            dclar dans la mme partie de dclaration de type que le type
            pointeur.

            Vous pouvez affecter une valeur  une variable pointeur avec la
            procdure 'NEW', l'oprateur '' ou la fonction 'POINTER'. La
            procdure 'NEW' alloue une nouvelle zone de mmoire sur la pile pour
            la variable dynamique et range l'adresse de cet espace mmoire dans 
            la
            valeur du pointeur. L'oprateur '' dirige la variable pointeur sur 
            la
            zone mmoire contenant des variables. La fonction 'POINTER' pointe 
la
            variable pointeur sur une adresse mmoire particulire.

            L'identifiant de constante prdclare 'NIL' reprsente une
            valeur pointeur constante qui est une valeur possible pour chacun 
des
            types pointeur. Par conception, nil est un pointeur qui ne pointe 
sur
            rien.

            Exemples de types pointeurs:

            * LongInt
            * Char
            * String(32)

            (attention: les * sont des accents circonflexes)

            ```TYPES IDENTIQUES ET TYPES COMPATIBLES:

            Deux types peuvent tre ou ne pas tre "identiques". Dans
            certains contextes il est ncessaire qu'ils soient identiques.
            D'autres fois mme s'ils ne sont pas identiques il peut tre
            ncessaire qu'ils soient compatibles et d'autres fois encore
            l'assignation de compatibilit est demande.

            ````TYPE identiques:

            Les types identiques sont ncessaires dans les contextes
            suivants:

            - entre les parameters de la variable formelle et actuelle
            - entre les types des rsultats formel et actuel des parameters de
            fonction
            - entre les valeurs et variables parameters formelles et actuelles
            dans les listes de parameters de fonctions ou procdures.
            - lorsqu'un tableau PACKED ARRAY OF CHAR unidimensionn est compar
            avec un autre  l'aide d'un oprateur.

            Deux types, t1 et t2 sont identiques si l'une des propositions est
            vraie :

            - t1 et t2 sont le mme identifiant de type
            - t1 est dclar comme tant quivalent  un type identique  t2

            ````TYPES compatibles:

            L'assignation de compatibilit est exige quand une valeur est
            affecte  quelquechose, soit explicitement (comme dans une
            instruction d'assignation) soit implicitement (comme le passage de
            parameters de valeurs).

            Une valeur de type t2 est assigne compatible avec un type t1 si
            l'une des propositions suivantes est vraie :

            - t1 et t2 sont de types identiques et ils ne sont ni de type 
fichier
            ni de type structur qui contiendrait un lment de type fichier.
            - t1 est un type rel et t2 est un type entier
            - t1 et t2 sont de types ordinal et la valeur de t2 est dans la 
gamme
            des valeurs possibles de t1
            - t1 et t2 sont compatibles de type ensemble et tous les lments 
des
            valeurs de type t2 sont dans la gamme des valeurs possibles du type
            de base de t1
            - t1 est un type chaine ou un type caractre et t2 est un type 
chaine
            ou une constante caractre entre apostrophes.
            - t1 est un type chaine compacte de n lments et la valeur de type
            t2 est un type chaine d'une constante caractre entre apostrophes
            ayant une longueur de n.

            Il y a erreur si l'assignation de compatibilit est exige et
            qu'aucune des propositions ci-dessus n'est vraie.

            ``CHAPITRE 14: LES VARIABLES

            ```DECLARATION DES VARIABLES:

            Une dclaration de variable est utilise pour allouer et associer
            un emplacement de mmoire avec un type particulier. Une variable est
            une entit dans la quelle une valeur est range. Chaque identifiant 
            de
            la liste d'identifiants d'une dclaration de variable montre que
            chaque variable a le type prcis dans la dclaration.

            dclaration de variables

            !


            --> ! LISTE D'IDENTIFIANTS ! ----> ! : ! ---> ! TYPE ! ---> ! ; ! 
            --->
            !



            La prsence d'un identifiant  l'intrieur de la liste des
            identifiants d'une dclaration de variables annonce qu'il y a un
            identifiant de variable pour le bloc dans lequel la dclaration
            apparait. On peut donc faire rfrence  la variable tout au long du
            bloc  moins que l'identifiant ne soit redclar dans un sous-bloc. 
            La
            redclaration cre une nouvelle variable utilisant le mme 
            identifiant
            sans affecter la valeur de la variable originale.

            Exemples de dclaration de variables:

            x,y,z: real;
            c: couleur;
            p1,p2: personne;
            aujourdhui: date;
            operateur: (plus,moins);
            digit: 0..9;
            coord: polaire;
            fait,errer: boolean;

            ```REFERENCES AUX VARIABLES:

            La rfrence  une variable se rapporte soit  une variable
            complte, un composant d'un type structur ou d'une chaine, une
            variable dynamique pointant par une variable de type pointeur, soit 

            une variable que l'on atteint par un appel  une fonction.

            rfrence  une variable




            ! !


            ! ! ! !
            ! !


            !---> ! APPEL A FONCTION ! ---! !--- ! QUALIFIANT ! <---!
            !



            ````LES QUALIFIANTS:

            La rfrence  une variable est compose d'un identifiant de
            variable suivi de zro, un ou plusieurs lments qui modifient le 
            sens
            de la variable ainsi rfrence.

            qualifiant
            !





            ! !


            ! !
            ! !


            !


            ! !


            ! !
            ! --- !
            !


            ---
            (attention: cette * est un accent circonflexe)

            Par exemple avec:

            var aMultiDimArray: array(1..100) of array(1..100) of integer

            on peut crire:

            aMultDimArray accder  tout le tableau
            aMultDimArray(1) accder au premier sous-tableau
            aMultDimArray(1,1) accder au premier lment du prmier
            sous-tableau

            ````Tableaux, chaines et index:

            Un composant dtermin d'une variable tableau est not par une
            rfrence  une variable de type tableau suivi d'une lment
            d'indexation qui prcise l'lment concern. Un caractre 
particulier
            dans une variable chaine est spcifi par la rfrence  la variable
            suivi d'un index qui prcise la position du caractre.

            index
            --- !





            --- ! !


            ! !
            ! --- !
            !


            ---

            Exemples de tableaux indexs :

            m(i,j)
            a(i+j)

            Chaque expression dans l'index slecte un lment dans le tableau
            de la dimension correspondante. Le nombre d'expressions ne doit pas
            dpasser le nombre de types indexs dans la dclaration de tableau.
            L'expression d'index doit tre d'assignation compatible avec le type
            index correspondant.

            Quand on indexe un tableau multidimensionnel, multi-index ou
            avec des expressions multiples on peut faire l'interchangeabilit. 
            Par
            exemple:

            MaMatrice (i)(j)  la mme sens que MaMatrice (i,j)

            Une variable chaine peut tre indexe avec une expression simple,
            dont la valeur doit se situer dans la gamme 0..n, o| n est la
            dimension dclare de la chaine. Indexer une chaine permet l'accs 
            un caractre de la chane. Le premier caractre d'une variable chaine
            (index 0) contient la longueur dynamique de la chaine.
            En gnral, on ne peut assigner une valeur  une position d'un
            caractre seul dans une chaine  moins que le caractre occupait 
            cette
            place auparavant. C'est  dire si la longueur dynamique de la chaine
            est infrieure  la position du caractre manipul, l'opration
            laissera la chaine inchange.
            Voir aussi chapitre 20.

            ````Enregistrements et dsignateurs de champs:

            Un champ dtermin d'une variable enregistrement est prcis par
            une rfrence  la variable enregistrement suivi par un dsignateur 
            de
            champs qui spcifie celui-ci.

            dsignateur de champs
            --- !





            --- !



            Exemples de dsignateurs de champs

            today.year
            p2*.pregnant (attention: cet * est un accent circonflexe)

            C'est une erreur d'accder  un composant variant d'un
            enregistrment non actif. Voir le chapitre 13.
            Dans une instruction situe dans une instruction WITH un
            dsignateur de champs n'a pas a tre prcd par la rfrence  la
            variable enregistrement qui le contient.

            ````Pointeurs et variables dynamiques:

            La valeur d'une variable pointeur est soit nil soit une valeur
            qui pointe vers une variable dynamique.

            La variable dynamique pointe par la variable pointeur est
            rfrence en crivant la variable pointeur immdiatement suivi de
            l'accent circonflexe.

            Les variables dynamiques et les valeurs des pointeurs qui
            pointent dessus sont cres par la procdure standard NEW. De plus
            l'oprateur 'aroba' () et la procdure standard POINTER peuvent 
tre
            utiliss pour crer des valeurs de pointeurs qui en fait ne pointent
            pas sur des variables dynamiques mais qui sont traits comme tel.

            La constante nil ne pointe sur aucune variable. Il y a erreur si
            vous accdez  une variable dynamique quand la valeur du pointeur 
est
            nil ou indfinie.

            Exemples de rfrences  des variables dynamiques :

            p1*
            p1*.sibling*

            (attention: les * sont des accents circonflexes)


            ````Modification du type d'une variable 'variable type casts':

            La rfrence  une variable d'un type donn peut tre change en
            une rfrence  une variable d'un autre type grace  un mcanisme
            appel en anglais 'variable type casts'

            variable de type casts

            !


            -->! IDENTIFIANT DE TYPE !->! ( !->! VARIABLE REFERENCE !--->! ) 
!-->
            !



            Quand une modification de type est applique  la rfrence  une
            variable, celle-ci est traite provisoirement comme tant du type
            spcifi par l'identifiant de type. La dimension de la variable 
            (c'est
             dire le nombre d'octets qu'elle occupe en mmoire) doit tre le 
            mme
            que la dimension du type reprsent par l'identifiant de type. Une
            variable de type cast peut tre suivie par un ou plusieurs 
            qualifiants
            comme pour la rfrence  une variable classique.

            Exemples de variable type casts:

            type point=record
            v,h:integer;
            end;

            var p:point;
            l:longint;

            begin
            p:=point(l);
            l:=longint(p);
            longint(p):=longint(p)+$00020002;
            end;

            ``CHAPITRE 15: LES EXPRESSIONS

            Les expressions indiquent des valeurs. L'expression la plus
            simple est par exemple la rfrence  une variable, cependant la
            plupart des expressions sont composes d'oprateurs et d'oprandes. 
            La
            plupart des oprateurs pascal sont binaires, ceci tant ils ont 
alors
            deux oprandes. Les autres oprateurs sont unaire et n'ont qu'un 
seul
            oprande. Quand plus d'un oprateur apparait dans une expression, 
les
            rgles de priorit sont appliques pour dterminer quels oprandes
            sont associs avec quels oprateurs. Par exemple, l'expression :

            a + b * c

            peut tre interprte soit comme (a+b)*c soit comme a + (b*c). Les
            rgles de priorit lvent l'ambiguit de l'interprtation:

            * quand un oprande apparait entre deux oprateurs de priorit
            diffrente, il est associ  l'oprateur ayant la plus grande
            priorit.

            * quand un oprande est crit entre deux oprateurs de mme priorit
            il est associ  l'oprateur de gauche.

            * une expression entre parenthses est toujours value avant de lui
            appliquer un oprateur.

            Priorit des oprateurs:

            Oprateurs unaires  , not
            oprateurs multiplicateurs *, /, div, mod, and
            oprateurs d'addition +, -, or
            oprateurs de relation =, <>, <, >, <=, >=, in

            Ainsi, l'expression a+b*c est interprte comme a+(b*c) car * a
            une plus grande priorit que +. Notez que a+b-c est interprt comme
            (a+b)-c car + et - ont la mme priorit.

            Les rgles de priorit suivent la syntaxe des expressions, qui
            sont construitent  partir de facteurs, termes et expressions 
            simples.

            La syntaxe d'une expression est ralise  partir d'oprateurs de
            relation appliqus aux expressions simples :

            expression 








            ! !



            ! ! ! ! ! ! ! !
            V V V V V V V !
            = < > <= >= <> in !
            ! ! ! ! ! ! ! 








            exemple d'expressions:

            x=1.5
            c in teinte1
            fait <>error
            p<=q

            La syntaxe d'une expression simple est le rsultat d'un ajout
            d'oprateurs et de signes appliqus  des termes:

            expression simple 





            ! ! ! 


            ! 


            !---->! signe !---! ! ----! ----! 





            ! 


            !



            exemples d'expressions simples:

            x+y
            -x
            teinte1 + teinte2
            b or c

            La syntaxe d'un terme est faite de l'utilisation des oprateurs
            de multiplication appliqus  des facteurs:

            terme 





            ! 


            ! -V- -V- -V-- --V-- --V-- --V--
            ! !*! !/! !**! !div! !mod! !and!
            ! --- --- ---- 


            !



            exemples de termes:

            x*y
            e/(1-e)
            fait and error

            La syntaxe d'un facteur est le rsultat des constructions
            suivantes:

            facteur 





            ! ! 


            ! !->!  !


            ! 


            ! 


            ! 


            ! 


            !->! constante non signe !


            ! 


            !->! appel de fonction !


            ! 


            !->! construction d'ensemble !


            ! 


            !->! ( !-->! expression !


            ! 


            !->!not !---->! facteur !






            Une constante non signe a la syntaxe suivante :

            constante non signe 





            ! 


            !


            ! 


            !


            ! 


            !





            exemple de facteurs:

            x (rfrence  variable)
            x (pointeur vers une variable)
            15 (constante non signe)
            'Bonjour' (constante non signe)
            (x+y+z) (sous-expression)
            sin (x/2) (appel  fonction)
            not q (ngation d'un boolen)
            ('A'..'F','a'..'f') (construction d'ensemble)

            ```LES OPERATEURS:

            Les oprateurs sont classs en oprateurs arithmtiques,
            oprateurs boolens, oprateurs d'ensembles, oprateurs de relation 
            et
            l'oprateur ''.

            ````Les oprateurs arithmtiques

            Les deux tableaux suivants montrent les types des oprandes et
            des rsultats avec des oprateurs respectivement binaires et 
unaires.

            Oprations arithmtiques binaires (sur deux lments)

            oprateur opration type de l'oprande type du rsultat

            + addition entier ou rel idem (entier ou rel) (1)
            - soustraction " " " "
            * multiplication " " " "
            / division " " rel (2)
            div division entire entier entier
            mod modulo entier entier

            (1) si mlange entier et rel l'oprande entier est converti en rel
            et le rsultat est de type rel.
            (2) les oprandes entiers sont toujours convertis en rels mme si 
            les
            deux oprandes sont de type entier.

            Oprations arithmtiques unaires

            Oprateur opration type de l'oprande type du rsultat

            + identit entier ou rel idem (entier ou rel)
            - signe de ngation entier ou rel idem (entier ou rel)

            Si deux oprandes des oprateurs +,-,*,div, ou mod sont du mme
            type d'entier (integer ou longint) les rsultats sont toujours du 
            mme
            type d'entier. Si l'un des oprandes est de type longint et l'autre 
            de
            type entier alors l'oprande entier est d'abord converti en longint 
            et
            le rsultat est de type longint. Dans les autres cas la valeur du
            rsultat est dtermine par les rgles normales des mathmatiques 
sur
            les entiers. Il y a erreur si la valeur du rsultat sort de la plage

            -maxint-1..maxint pour les entiers et de la plage
            -maxlongint-1..maxlongint pour les entiers longs.

            Si l'un des oprandes des oprateurs +,-, ou * est d'un type
            rel, le rsultat est toujours de type tendue et a une valeur qui 
            est
            une approximation du rsultat mathmatique normal. Le rsultat de
            l'opration avec l'oprateur / est toujours de type tendue.

            Si l'oprande de l'identit ou de ngation est de type entier, le
            rsultat est toujours du mme type d'entier et la valeur absolue du
            rsultat est toujours identique  la valeur absolue de l'oprande.

            Si l'oprande de l'identit ou de ngation est de type rel, le
            rsultat est toujours de type rel et la valeur absolue du rsultat
            est toujours identique  la valeur absolue de l'oprande.

            ````Oprateurs Boolens:

            Les types des oprandes et des rsultats pour les oprations
            boolennes sont montrs dans la table suivante :

            Oprateur opration type de l'oprande type du rsultat

            or disjonction boolen boolen
            and intersection " "
            not ngation " "

            Le rsultat d'une opration boolenne est dtermine par les
            rgles de l'algbre de Boole, par exemple a and b est valu vraie 
si
            et seulement si a et b sont vraies.

            ````Oprateurs sur les ensembles

            Les types des oprandes et des rsultats figurent dans le tableau
            suivant:

            Oprateur Opration type de l'oprande type du rsultat

            + union type ensemble compatible Si types des oprandes
            - diffrence " " identiques alors mme
            * intersection " " que oprandes sinon

            Les rsultats des oprations sur ensembles sont dtermins par
            les rgles normales sur les ensembles.

            * une valeur ordinale c est dans l'ensemble a+b si et seulement si c
            est en a ou en b.
            * une valeur ordinale c est dans l'ensemble a-b si et seulement si c
            est en a et non en b.
            * une valeur ordinale c est dans l'ensemble a*b si et seulement si c
            est en a et en b.

            ````Oprateurs de relation

            Les types des oprandes et des rsultats des oprations de relation
            sont montrs dans le tableau suivant:

            Oprateur Type de l'oprande type du rsultat

            = <> compatible simple, pointeur, boolen
            ensemble, chaines ou chaines
            compactes
            < > compatible simple, chaines boolen
            ou chaines compactes
            <= => compatible simple, ensemble, boolen
            chaine ou chaine compacte
            in op de gauche:ordinal T boolen
            op de droite:ensemble de T

            ````Comparaison entre types ordinaux

            Quand les oprandes des oprateurs =, <>, <, >, >= ou <= sont
            de type ordinal ils doivent tre de types compatibles  moins que 
            l'un
            des oprandes ne soit de type rel l'autre tant alors considr 
            comme
            tant de type entier. Le rsultat est la relation mathmatique des
            ordinaux. Quand on compare des types rels, les rsultats peuvent 
            tre
            diffrents de ce l'on attend car la reprsentation d'une valeur 
            relle
            est seulement une approximation.

            ````Comparaison entre chaines

            Quand les oprateurs relationnels =, <>, <, >, <=, et >= sont
            utiliss pour comparer des chaines, celles-ci sont compares selon
            leur ordre lexicographique. Notez que n'importe qu'elle paire de
            chaines peuvent faire l'objet d'une comparaison car toutes les 
            valeurs
            des chaines sont compatibles. De plus une valeur char est compatible
            avec une valeur de type chaine et quand on fait la comparaison la
            valeur de type char est traite comme une chaine de longueur gale 
            1. Quand une valeur de type chaine compacte qui a n lments est
            compare avec une valeur de type chaine, elle est traite comme une
            valeur de type chaine qui aurait une longueur gale  n.

            ````Comparaison entre chaines compactes

            Les oprateurs de relation =, <>,<,>,<= et >= peuvent aussi tre
            utiliss pour comparer deux valeurs de type chaine compacte si 
            toutes
            les deux ont le mme nombre d'lments. Si ce nombre est n alors le
            rsultat est le mme que si les deux chaines taient de type chaine 
            et
            de longueur n. Voir aussi le chapitre 13 sur les Packed Array of 
            Char.

            ````Comparaison d'ensembles

            Si a et b sont des oprandes d'ensemble alors :

            * a=b est vrai si et seulement si chaque membre de a est membre de b
            et chque membre de b est membre de a, sinon a<>b.

            * a<=b est vrai si et seulement si chaque membre de a est aussi 
            membre
            de b.

            * a>=b est vrai si et seulement si chaque membre de b est aussi 
            membre
            de a.

            Ainsi a=b et a<>b indiquent respectivement l'quivalence ou la
            non-quivalence des ensembles a et b, et a<=b et a>=b indiquent
            respectivement l'inclusion de a dans b et l'inclusion de b dans a.

            ````Comparaisons de pointeurs

            Les oprateurs de relation = et <> peuvent tre appliqus  des
            oprandes de type pointeur compatible. Deux pointeurs sont gaux si 
            et
            seulement s'ils indiquent le mme objet.

            ````Test d'appartenance  un ensemble

            L'oprateur in retourne la valeur vraie si la valeur de
            l'oprande de type ordinal est membre de l'oprande de type 
ensemble;
            sinon il fournit la valeur false. Le type de l'oprateur de gauche
            doit tre compatible avec le type de base de l'oprateur de droite.

            ````L'oprateur aroba ""

            Une valeur pointeur qui pointe sur une variable, procdure ou
            fonction peut-tre cre avec l'oprateur aroba. L'oprande et les
            types du rsultat sont montrs dans le tableau qui suit.

             est un oprateur unaire qui prend la rfrence d'un identifiant
            de variable, de procdure ou de fonction pour en faire son oprande 
            et
            calcul la valeur de son pointeur. Si l'oprande de l'oprateur aroba
            est une rfrence  une variable, alors la valeur de pointeur est
            l'adresse en mmoire o| la variable est range. Si l'oprande de
            l'oprateur aroba est un identifiant de procdure ou de fonction 
            alors
            la valeur du pointeur est le point d'entre de la procdure ou de la
            fonction. Le type de la valeur est quivalent au type du pointeur
            anonyme de la constante pointeur nil, par exemple il peut tre
            attribu  n'importe quelle variable pointeur.

            Oprations avec les pointeur

            Oprateur Opration Type de l'oprande Type du rsultat

             cration de pointeur rfrence  variable, type pointeur
            identifiant de proc-
            dure ou de fonction.

            L'oprateur aroba devra tre utilis seulement avec des
            procdures et fonctions dclares dans la partie dclaration du
            programme ou du module (dclarations globales) quand la valeur
            rsultante du pointeur est transmise  une routine de l'Apple II GS 
            en
            ROM. Les procdures et fonctions dclares dans la partie 
dclaration
            d'une autre procdure ou fonction (dclarations emboites) ont une
            convention d'appel diffrente qui n'est pas compatible avec les
            routines ROM de l'Apple II GS. En outre l'option de compilation 
            pascal
            TML 'DefProc' devra tre utilise quand la valeur rsultante du
            pointeur est transmise  une routine ROM de l'Apple II GS. Voir
            l'annexe "A l'intrieur du Pascal TML" pour des dtails sur les
            conventions d'appel Pascal et l'emploi de l'option de compilation
            "DefProc".

            ````` avec les Variables:

            L'utilisation de l'oprateur '' avec des variables ordinaires
            (pas des parameters) est vidente. Par exemple, si on a:

            type twochar = packed array (0..1) of Char;
            var int: integer;
            twocharptr: *twochar;
            (attention: cet * est un accent circonflexe)

            alors on peut crire:

            twocharptr := int

            ceci va forcer TWOCHARPTR  pointer sur la variable INT. Puisque les
            types Integer et Twochar ont le mme type de stockage, la valeur de
            Int rcupre via Twocharptr, est r-interprte en type Twochar.

            ````` et les Valeurs parameters:

            Si '' s'applique  une valeur parameter formel, le rsultat est
            un pointeur sur l'adresse de la pile contenant la valeur actuelle. 
Si
            aParam est une variable formelle dans une procdure, et que actParam
            est la variable passe  la procdure comme tant la variable 
            actuelle
            aParam, et si aPtr est un pointeur; alors si on excute:

            aPtr := aParam;

            alors aPtr est un pointeur sur actParam dans la pile et aPtr* donne 
            la
            valeur de actParam. (attention: cette * est un accent circonflexe)

            ````` avec une variable parameter:

            Si '' s'applique  une variable parameter formel, le rsultat
            est un pointeur sur le parameter actuel. Dans ce cas, le pointeur 
est
            pris  partir de la pile. Si aParam est une variable parameter 
formel
            dans une procdure, et que actParam est une variable passe  la
            procdure en tant que parameter aParam actuel, et si aPtr est un
            pointeur; alors si on excute:

            aPtr := aParam

            alors aPtr est un pointeur sur actParam et aPtr* donne le contenu de
            actParam. (attention: cette * est un accent circonflexe)

            ````` avec une procdure ou une fonction:

            Lorsque '' est employ avec une procdure ou une fonction, le
            rsultat sera un pointeur sur son point d'ente. Il n'y a aucune
            possibilit d'utiliser cela avec le Pascal. Le seul emploi possible
            d'un pointeur sur une procdure est de le passer  une procdure
            ToolBox que la boite  outil utilise pour appeler la fonction 
            dsigne
            par une instruction ASM de type JSL. Les pointeurs sur procdure
            servent gnralement  implmenter la dfinition de procdures et 
les
            procdures de filtrage.
            L'oprateur '' doit tre uniquement employ avec des procdures
            ou fonctions dclares dans la partie dclarative du programme ou de
            l'unit (dclarations globales) lorsque la valeur du pointeur 
            rsultant
            est passe  une routine de la boite  outils. Les procdures et
            fonctions dclares dans une autyre procdure ou fonction
            (dclarations imbriques) on des conventions d'appel diffrentes les
            rendant incompatibles avec les routines de la boite  outils.

            ```APPLE DE FONCTION:

            Un appel  une fonction prcise l'activation du bloc associ 
            l'identifiant de la fonction. Le rsultat renvoy par l'activation 
de
            la fonction est utilis comme une valeur expression. Si la fonction 
a
            des parameters formels alors le dsignateur de fonction doit 
contenir
            la liste correspondante des parameters actuels. A chaque parameter
            actuel est substitu le parameter formel correspondant.

            Exemples d'appels  des fonctions:

            sum(a,63)
            sin(x+y)
            eof(f)
            ord(f*) (attention: cet * est un accent circonflexe)

            Voir le chapitre 17 pour la description des appels de procdures.

            ```LES CONSTRUCTIONS D'ENSEMBLE:

            La cration d'un ensemble prcise une valeur d'un type ensemble
            et elle est ralise en crivant des expressions encadres par des
            crochets rectangulaires. Chaque expressions prcise une valeur de
            l'ensemble.

            S'il n'y a rien dans une paire de crochets rectangulaires
            l'ensemble est vide, c'est une affectation compatible  tous les 
            types
            'ensemble'. Tout groupe d'lments x..y signifie que toutes les
            valeurs des lments de l'ensemble sont situes dans la plage de x  
            y
            bornes comprises. Si la valeur de x est plus grande que la valeur de 
            y
            alors x..y signifie aucun lment et (x..y) est un ensemble vide.

            Toutes les valeurs d'une expression dans les lments groups
            d'une cration d'ensemble doivent tre de type ordinal compatible. 
Si
            a est la valeur ordinal la plus petite dans l'ensemble rsultant, et
            si b est la valeur ordinal la plus grande de l'ensemble rsultant
            alors le type de base de l'ensemble rsultant est a..b

            Exemples d'ensembles:

            (rouge, c, vert)
            (1, 5, 10..k MOD 12, 23)
            ('A'..'Z','a'..'z', CHR(13))

            ```VALEUR D'UN TYPE MODIFIE:

            Le type d'une expression peut tre chang en un autre type par
            une valeur de type modifi.

            L'argument de l'expression doit tre d'un type ordinal ou de type
            pointeur. Le rsultat d'un type modifi est du type spcifi et sa
            valeur ordinale est obtenue par la conversion de l'expression. La
            syntaxe d'une valeur d'un type modifi est presque identique  celle
            de la valeur de variable modifie. Cependant les valeurs de type
            modifi oprent sur des valeurs et non sur des variables et ne 
            peuvent
            donc pas constituer des rfrences  variables. Ceci tant, une 
            valeur
            de type modifi peut ne pas avoir de qualifiant dans la partie 
gauche
            d'une dclaration d'affectation ou avoir un parameter actuel o| le
            parameter formel est dclar comme parameter VAR.

            Exemples de valeurs de type modifi:

            integer('c')
            ptr($89F2)
            boolean(0)

            ``CHAPITRE 16: LES INSTRUCTIONS

            Les instructions dcrivent les actions algorithmiques pouvant
            tre excutes. Il y a deux classes d'instructions: les instructions
            simples et les instrucctions structures. Les instructions peuvent
            tre prfixes par un label et les labels sont rfrencs par les
            instructions GOTO.

            instruction 





            ! 


            !-->! label !->! : !-! ! 









            Un label est une constante entire non ngative, dclare en
            premier dans la dclaration des labels (voir chapitre 11).

            label 









            ```LES INSTRUCTIONS SIMPLES:

            Une instruction simple est une instruction ne contenant aucune
            autre instruction. L'instruction vide est une instruction simple ne
            contenant aucun symbole et ne spcifiant aucune action.

            instruction simple 





            ! 


            !


            ! 


            !


            ! 


            !






            instruction vide




            ````Instruction d'assignation:

            L'instruction d'assignation permet d'effectuer une de ces deux
            actions:

            - remplacer la valeur courante d'une variable par une nouvelle
            valeur spcifie dans une expresion.
            - spcifier une expresion dont la valeur sera retourne par une
            fonction.

            instruction d'assignation






            ! 


            ---->! identifiant foncction !






            Le symbole := peut se lire 'donner la valeur'. L'expression doit
            tre compatible, en terme d'assignation, avec le type de la variable
            ou avec le type du rsultat de la fonction. L'identifiant de la
            fonction doit tre celui de la fonction en cours.

            La rfrence  la variable  gauche identifie une variable de
            n'importe quel type sauf FILE. Avec la plupart des variables, la
            rfrence  la variable est juste un nom d'identifiction, mais dans
            certains cas la variable est suivie d'une qualification:

            - chaine: le nom de la variable est suivi par un indexage entre
            crochets.
            - tabelau: la varibalee est identifie par le nom du tableau
            suivi par un index entre crochets pour chaque dimension du
            tableau.
            - champ d'enregistrement: le nom de la variable doit tre prcd
            parle nom de la structure et un point. La seule exception est
            l'emploi de l'instruction dans une boucle WITH associe 
            l'enregistremnt correspondant.
            - variable dynamique: la rfrence  la variable est dfinie par
            le nom de son pointeur suivi du *. (attention: cette * est un
            accent circonflexe)

            De plus, une rfrence  une variable situe  gauche peut tre
            une dfinition de type. Voir le chapitre 13 pour plus d'informations
            et la compatibilit des types et la syntaxe de ces variables.

            Exemples d'assignations:

            x := y+z
            p := (1<=i) and (i<100)
            i := sqr(k) - (i*j)
            coul := bleu, succ(c)

            Il n'est pas spcifi si l'valuation de la rfrence  la
            variable est effectue avant ou aprs l'valuation de l'expression.
            Cependant, lorsque la rfrence  la variable est tablie, elle 
n'est
            pas altre par les effets de dbordement d|s  l'excution du 
            restant
            de l'instruction d'assignation. Ainsi:

            Ai := Une_Fonction(i);

            est li  la modification de i par la fonction, et si c'est le cas,
            selon que la fonction est value avant ou aprs Ai.

            ````Instruction Procdure:

            Une instruction procdure dfinit un bloc spcifi par les
            identifiants de procdure. Si la procdure  des parameters formels,
            alors l'instruction de procdure doit contenir la liste 
            correspondante
            des parameters actuels. Chaque parameter actuel est remplac par le
            parameter formel correspondant dans la liste, lors de l'appel  la
            procdure.

            instruction procdure









            +-->! liste param. acts. !-+




            L'identifiant utilis pour dfinir une procdure doit tre
            identique  celui utilis dans la dclaration. Les parameters dans 
la
            dclaration de fonction ou de procdure sont appels 'parameters
            formels'; ceux dans l'instruction d'appel sont appels 'parameters
            actuels'. Les valeurs dans la liste des parameters actuels seront
            passes aux parameters formels lors de l'appel. Le nombre de
            parameters dans la liste formelle doit tre quivalent et compatible
            avec les parameters actuels. Il y a 3 exceptions  cette 
            compatibilit:

            - les sous-types sont quivalents  leurs types de
            base.
            - un parameter formel de type LongInt accepte un
            parameter actuel de type Integer.
            - les parameters formels prcds par UNIV acceptent
            tout parameter actuel occupant le mme espacement
            mmoire. Voir le chapitre 19 au sujet de UNIV.

            Les parameters actuels spcifis dans un appel  une fonction ou
             une procdure doivent respecter les rgles suivantes:

            - les variables parameters actuels,  l'oppos des
            valeurs parameters, doivent tre des variables. Les
            variables parameters actuels ne peuvent tre des
            constantes, expressions, lments ou variables
            compactes.
            - la valeur d'une chaine variable parameter peut tre
            passe  toute chaine variable parameter, sans soucis
            de la longueur des chaines.
            - si la valeur d'un parameter actuel excde
            l'intervalle de dfinition d'un parameter formel, un
            erreur d'excution se produit.

            ```LES INSTRUCTIONS STRUCTUREES:

            Les instructions structures sont constitues d'autres
            instructions s'excutant conditionnellement, rptitivement ou
            squentiellement.

            ````Les instructions -la-suite:

            Ce type d'instruction dfinit l'excution d'une squence
            d'instructions, dans l'ordre de leur criture.

            instructions en squence



            --->! begin !





            +






            Le corps de toute procdure, fonction ou programme MAIN en Pascal
            est une suite d'instructions. Une trelle squence commence par BEGIN
            et se conclut par END, chaque instruction lmentaire situe entre 
            ces
            bornes se termine par ;. Les suites d'instructions peuvent tre
            imbriques dans d'autres suites. Dans ce cas, chaque END est appari
            avec le BEGIN prcdent le plus proche.
            Exemple:

            begin
            z:= x;
            x:= y;
            y:= z;
            end

            ````Les instructions conditionnelles:

            Une telle instruction dtermine si certains (ou aucun) de ses
            constituants seront excuts.

            instruction conditionnelle 





            ! 


            +






            ````L'instruction IF:

            Cette instruction excute une instruction (qui peut tre une
            squence d'instructions) si une expression Boolenne est TRUE. Une
            clause optionnelle ELSE peut tre ajoute afin de faire excuter une
            autre instrution au cas ou l'expression Boolenne serait FALSE.
            L'instruction associe avec la clause ELSE, peut galement tre une
            squence d'instructions.

            instruction IF



            ---->! IF !--->! expression !-->! THEN !-->! instruction !--+---+->



            +


            ! 


            +--->! ELSE !-->! instruction !






            L'expression entre IF et THEN est ordinairement constitue
            d'oprateurs logiques et relationnels et son type doit tre boolen.
            On peut avoir des instructions IF imbriques. Dans ce cas, chaque
            ELSE est toujours associ avec le IF le plus proche non associ
            lui-mme avec un autre ELSE.
            Exemples:

            if x < 1.5 then
            z := x+y
            else
            z := 1.5

            if p1 <> nil then
            p1 := p1*.pere; (* est un accent circonflexe)

            ````Les instructions CASE:

            Cette instruction est constitue d'une expression (le slecteur)
            et d'une liste d'instructions. Chaque instruction est prfixe par 
            une
            ou plusieurs constantes (les constantes CASE), ou par le mot rserv
            OTHERWISE. Toutes les constantes case doivent tre distinctes et
            doivent tre d'un type ordinal compatible avec le type de 
            l'expression
            slectionnante.

            instruction case 








            +


            ! 


            +-+->! CASE !--+--+


            ! 


            +----! ; !<--+ +-->! OTHERWISE !---+




            case 


            ---+->!expression!-+


            ! !constante ! ! ---- 


            ! 


            ! 


            +






            clause otherwise 









            L'instruction CASE excute l'instruction prfixe par la
            constante CASE gale  la valeur du slecteur. Si aucune constante
            CASE ne rpond  ce critre, et que la clause OTHERWISE soit 
            prsente,
            l'instruction suivant OTHERWISE est excute; si OTHERWISE n'est pas
            prsent, alors l'excution se poursuit avec l'instruction suivant
            l'instruction CASE.
            Chaque instruction dans la clause CASE ou OTHERWISE peut tre une
            squence d'instructions.
            Exemples:

            case operateur of
            plus : x := x+y;
            moins : x := x-y;
            fois : x := x*y
            end;

            case i of
            1 : x := sin(x);
            2 : x := cos(x);
            3,4,5 : x := exp(x);
            otherwise x := ln(x);
            end;

            ````Instruction de rptition:

            Ceci indique qu'un groupe d'instructions doit tre rpt un
            certain nombre de fois.

            instruction de rptition 





            ! 


            +


            ! 


            +






            Si le nombre de rptitions est connu  priori, l'instruction FOR
            est la plus approprie; sinon REPEAT et WHILE sont employs.

            ````L'instruction REPEAT:

            Cette instruction contient une expression controlant l'excution
            rptitive d'une squence d'instructions contenues dans cette
            instruction REPEAT.

            instruction repeat









            +






            L'expression doit gnrer un rsultat de type boolen. Les
            instructions entre les symboles REPAT et UNTIL sont excutes
            rptitivement jusqu' ce que l'expression contienne la valeur TRUE.
            La squence d'instructions est excute au moins une fois, car
            l'expression est value APRES l'excution de la squence.
            REPEAT et UNTIL n'ont nul besoin de l'emploi de Begin et End pour
            dlimiter la squence.
            Exemples:

            repeat
            k := i mod j;
            i := j;
            j := k
            until j=0

            repeat
            process(f*); (attention: * est un accent circonflexe)
            read(f)
            until eof(f)

            ````L'instruction WHILE:

            L'instruction While comprend une expression controlant
            l'excution rptitive d'une instruction.

            instruction while










            L'expression doit gnrer un rsultat de type boolen.
            L'expression est value AVANT chaque excution de la boucle.
            L'instruction est excute rptitivement tant que l'expression
            contient la valeur TRUE. Si l'expression contient FALSE ds le 
            dpart,
            l'instruction n'est pas excute.
            L'instruction controle par une instruction While peut tre soit
            une instruction simple, soit une squence d'instructions.
            Exemples:

            while ai <> x do
            i := i+1

            while i>0 do begin
            if oddi then
            z := z*x;
            i := i div 2;
            x := x*x
            end

            Attention  ce que l'expression boolenne change bien de valeur
            dans les instructions REPEAT et WHILE, autrement on bouclerait sans
            fin. Sinon, on peut quitter la boucle par GOTO, EXIT ou LEAVE (voir
            plus loin).

            ````L'instruction FOR:

            Cette instruction provoque l'excution rptitive d'une
            instruction aussi longtemps qu'un index reste dans un intervalle
            dfini. Cet index progresse squentiellement  chaque excution de 
la
            boucle.

            instruction for



            ---->! FOR !-->! variable !-->! := !-->! expression !--+



            +


            ! 


            +--+-->! to !----+->! expression !-->! do !-->! instruction !->
            ! 


            ! 


            +->!downto !--+




            La premire expresion suivant le := est appele VALEUR INITIALE.
            La seconde expression aprs le := est appele VALEUR FINALE. La
            variable de controle, valeur initiale, et la valeur finale doivent
            tre compatibles. Voir le chapitre 13 au sujet de la compatibilit 
            des
            types.

            La variable de controle est de type scalaire (Integer, Char,
            boolean, subrange ou dfini par l'utilisateur). Cependant, ce ne 
peut
            tre un tableau ou une chaine, un champ d'enregistrement ou une
            variable dynamique. Cette variable de controle doit tre dclare 
            dans
            le bloc contenant l'instrucion FOR. Une nouvelle valeur lui est
            assigne par l'instruction FOR avant chaque excution de la boucle. 
            La
            valeur de la variable de controle est accessible dans l'instruction
            gre par FOR.

            Si le mot rserv aprs la premire expression est TO, la
            variable de controle sera incrmente avant chaque excution de la
            boucle. L'excution de l'instruction FOR se poursuit jusqu' ce que 
la
            variable de controle ait une valeur plus grande que la valeur finale
            autorise. Si le mot rserv aprs la premre expression est DOWNTO,
            la variable est alors dcrmente avant chaque excution de la 
            boucle,
            et l'excution du procesus se poursuit jusqu' ce que la variable 
ait
            une valeur infrieure  la valeur finale autorise.

            Voici quelques rgles  respecter pour dfinir une instruction
            FOR:

            - la variable de controle doit tre une variable simple dclare
            dans la zone locale.
            - si la variable de controle est de type subrange ou un scalaire
            dfinit par l'utilisateur, elle doit accepter toutes les
            valeurs comprises entre la valeur initiale et la valeur
            finales, bornes comprises.
            - la variable de controle ne doit pas tre modife dans la boucle
            gre par l'instruction FOR.
            - la variable de controle peut ne pas tre inclue dans les
            expressions dfinissant les valeurs finales ou initiales.
            - la variable de controle peut ne pas tre spcifie  la fin de
            l'instruction FOR.
            - les valeurs initiales et finales ne sont value qu'une fois,
            avant l'excution du premier passage. Ensuite, toute
            modification de l'une ou l'autre des valeurs sera sans effet
            sur le droulement de la boucle.
            - si les valeurs initiales et finales sont identiques, la boucle
            n'est excute qu'une fois.

            Exemples:

            for i:= 2 to 63 do
            if ai > max then
            max := ai

            for c := red to blue do check(c);

            ```INSTRUCTIONS DE CONTROLE:

            Les instructions de rptition, conditionnelles, d'assignation
            ainsi que les appels aux procdures ou fonctions servent  assurer 
la
            plupart des taches en Pascal. Mais dans certains cas, on peut avoir
            des situations demandant l'arrt immdiat du programme. Dans ces 
cas,
            TMLII dispose de certains outils:

            - l'instruction GOTO pour passer le controle  une autre partie
            du programme situe dans le mme bloc.
            - l'instruction CYCLE forant le passage  la prochaine itration
            d'une instruction de rptition.
            - l'instruction LEAVE pour quitter la boucle d'une instruction de
            rptition.
            - l'instruction HALT pour stopper immdiatement l'excution du
            programme.

            ````L'instruction GOTO:

            L'instruction GOTO passe le controle du programme  l'instruction
            suivant le label.

            instruction goto 









            Voici les rgles  respecter pour employer cette instruction:

            - le lable rfrenc par une instruction GOTO doit tre dans le
            mme bloc que l'instruction GOTO, ou dans un bloc contenant
            l'instruction GOTO.
            - le saut dans une instruction structure  partir d'un endroit
            extrieur  cette instruction va produire des effets non
            prvisibles. Toutefois, TML Pascal ne dtecte pas ce genre de
            situation.

            Voir aussi le chapitre 13.

            ````L'instruction CYCLE:

            L'instruction CYCLE passe le controle du programme  la fin de
            l'instruction gre par le WHILE, REPEAT ou FOR. L'emploi de CYCLE
            hors d'une boucle WHILE, REPEAT ou FOR gnre une erreur.

            Exemples:

            for i:=1 to 100 do begin
            if ai <=0 then cycle;
            f(ai);
            end;

            CYCLE n'est pas un mot rserv, il peut donc tre redfini et
            dans ce cas, il ne peut tre employ dans le bloc o| il est 
redfini.

            ````L'instruction LEAVE:

            L'instruction LEAVE conclue la boucle WHILE, REPEAT ou FOR et
            passe le controle  l'insruction suivant immdiatement la boucle.
            L'emploi de LEAVE en dehors d'une boucle gnre une erreur.

            Exemples:

            while i<63 do begin
            if ai = x then leave;
            i := i+1;
            end;
            LEAVE n'est pas un mot rserv, il peut donc tre redfini et
            dans ce cas, il ne peut tre employ dans le bloc o| il est 
redfini.

            ````L'instruction WITH:

            L'instruction WITH est une mthode simple pour dsigner des
            champs d'un enregistrement. Avec une instruction WITH, les champs
            d'une ou plusieurs variables d'un enregistrement peuvent tre
            rfrencs en utilisant uniquement les identifiants des champs. 
Voici
            la syntaxe de cette instruction:



            with 








            ! 


            +






            L'emploi d'une variable dans une instruction WITH caractrise
            l'utilisation d'un enregistrement. Dans une instruction WITH, chaque
            rfrence par variable est tout d'abord interprte comme un champ
            d'enregistrement. Mme si une variable de mme nom est accessible,
            c'est toujours la rfrence au champ de l'enregistrement qui est
            traite dans cette instruction.
            Voici les rgles  respecter dans l'emploi de with:

            - lorsqu'on liste un enregistreement qui est le champ d'un autre
            enregistrement, il faut d'abord lister l'enregistrement
            contenant ou lister ce champ dans sa forme explicite.
            - les instructions WITH peuvent tre imbriques. Dans ce cas, le
            WITH contenant les autres WITH imbriqus reste valide mme dans
            les boucles imbriques.
            - lorsque plusieurs enregistrements ont des champs de mme nom,
            WITH fera rfrence au champ du dernier enregistrement nomm
            dans la liste du WITH.
            - lorsque l'identifiant d'un champ d'enregistrement est le mme
            qu'une variable ou qu'un autre identifiant dclar hors de
            l'enregistrement, le WITH accde au champ.

            Exmples:

            with date do
            if month = 12 then begin
            month:= 1;
            year := year +1;
            end
            else month := month +1

            ceci est quivalent :

            if date.month then begin
            date.month := 1;
            date.year := date.year +1
            end
            else date.month := date.month +1

            Lorsque plus d'une rfrence de variable  un enregistrement se
            trouve dans une instruction WITH comme:

            with var1, var2, ... varN do instruction

            alors cela est trait comme une suite imbrique:

            with var1 do
            with var2 do
            ...
            with varN do
            instruction

            Si varN est un champ de var1 et var2, il est interprt sous la
            forme var2.varN et non comme var1.varN.


            ````L'instruction NULL:

            Les instructions NULL sont des instructions ne contenant rien.
            Les point-virgules non indispensables sont traits sous forme
            d'instructions nulles par TML. Le rsultat produit par une 
            instruction
            nulle est la prsence de deux instructions au lieu d'une.
            Gnralement, cela n'est pas gnant, mais toutefois cela peut 
            produire
            des erreurs.

            ``CHAPITRE 17: PROCEDURES ET FONCTIONS

            Les procdures et fonctions vous permettent d'imbriquer des blocs
            dans le bloc principal ou de dfinir des UNITS. Les procdures et
            fonctions sont aussi appeles 'sous-programmes'. Chaque procdure et
            fonction  un en-tte suivi par un bloc ou une directive spciale. 
            Une
            procdure est active par une instruction de procdure, et une
            fonction est active par l'valuation d'une expression contenant un
            appel  une fonction.

            ```DECLARATION DES PROCEDURES:

            Une dclaration de procdure asssocie un identifiant avec un
            bloc; celui-ci pouvant tre activ par une instruction de procdure.

            dclaration de procdure



            ---->! en-tte de proc. !->! ; !->! corps de proc. !->! ; !->




            corps de procdure



            ---+--->! bloc !


            ! 


            +--->!forward !


            ! 


            +--->! external !


            ! 


            +--->! inline !---+>! entier non-sign !-+


            ! 


            ! +


            ! 


            +--->! tool !-->! entier non !--! , !-! entier non !-+-->







            L'en-tte de procdure spcifie l'identifiant de la procduree et
            les parameters formels ventuels.

            en-tte de procdure



            ---->! procdure !





            +


            +


            ! 


            +






            La syntaxe des parameters formels est dcrite plus loin dans ce
            chapitre.

            Une procdure est active par une instruction de procdure qui
            indique l'identifiant de la procdure et les parameters actuels 
            requis
            par elle. Les instructions  excuter par la procdure sont 
            spcifies
            par la partie 'instructions' du bloc de la procdure. Si 
            l'identifiant
            de la procdure est utilis dans une une instruction de procdure 
            dans
            le bloc de procdure, la procdure est excute rcurcivment. C'est 

            dire que la procdure s'appelle elle mme en cours d'excution.

            Exemple de dclaration de procdure:

            procedure Num2String (N: integer; var S: string);

            var V: integer;
            begin
            V := Abs(N);
            S:='';
            repeat
            S:= concat(Chr(V mod 10 + ord('0')),S);
            V:= V div 10;
            until V = 0;
            if V<0 then S := Concat(('-',S);
            end;

            Au lieu du bloc dans une dclaration de procdure ou de fonction,
            on peut trouver une directive FORWARD, EXTERNAL, INLINE ou TOOL. 
Voir
            le paragraphes traitant des directives, dans ce chapitre.

            ```DECLARATION DES FONCTIONS:

            Une dclaration de fonction associe un identifiant avec un bloc,
            sous forme d'une fonction pouvant tre activ par un appel de 
            fonction
            afin de calculer et retourner une valeur d'un type quelconque.

            dclaration de fonction



            ---->! en-tte de fonc. !->! ; !->! corps de fonc. !->! ; !->




            corps de fonction



            ---+--->! bloc !


            ! 


            +--->!forward !


            ! 


            +--->! external !


            ! 


            +--->! inline !---+>! entier non-sign !-+


            ! 


            ! +


            ! 


            +--->! tool !-->! entier non !--! , !-! entier non !-+-->







            L'en-tte de fonction spcifie l'identifiant de la fonction et
            les parameters formels ventuels, ainsi que le type du rsultat.

            en-tte de fonction



            ---->! fonction !





            +


            ! 


            +


            ! 


            +


            ! parameters!
            ! formels !




            Une fonction est active par l'valuation d'un appel de fonction,
            qui donne l'identifiant de la fonction ainsi que les parameters
            formels requis. L'appel  la fonction est sous la forme d'un 
oprande
            dans une expression. L'expression est value en excutant la
            fonction, et en fait en remplaant l'appel  la fonction par la 
            valeur
            retourne par la fonction.

            Les instructions  excuter sous controle de la fonction sont
            spcifis par la partie instruction du bloc de la fonction. Le bloc
            devrait normalement contenir au moins une instruction d'assignation
            assignant une valeur  l'identifiant de la fonction. Le rsultat 
            d'une
            fonction est la dernire valeur assigne. Si aucune instruction
            d'assignation n'existe, ou si elle existe mais n'est pas excute, 
la
            valeur retourne par la fonction est indfinie.

            Si l'identifiant de la fonction est utilis dans une appel de
            fonction  l'intrieur du bloc de la fonction, la fonction est
            excute rcursivement.

            Exemple de dclaration de fonction:

            function Num2String(N: integer;): string;

            var V: integer;
            S: string;
            begin
            V := Abs(N):
            S := '';
            repeat
            S:= concat(Chr(V mod 10 + ord('0')),S);
            V := V div 10;
            until V = 0;
            if V<0 then S:= concat('-',S);
            Num2String:=S;
            end;

            Une fonction peut tre dclare FORWARD, EXTERNAL, INLINE ou
            TOOLde la mme manire que pour les procdures.
            Si la valeur de retour d'une fonction est un type enregistrement
            ou un pointeur sur un type enregistement, on ne peut l'utiliser dans
            la liste d'une instruction WITH afin d'assigner des valeurs aux 
            champs
            de cet enregistrement. Le compilateur interprtera l'emploi de
            l'identifiant de la fonction dans l'instruction WITH comme tant un
            appel  la fonction.

            ```DIRECTIVES DE FONCTIONS ET PROCEDURES:

            A la suite d'une procdure ou fonction, la partie constitue des
            instructions peut tre remplace par une de ces quatre directives:

            - FORWARD: permet  la procdure ou  la fonction
            d'tre dclare immdiatement tout en ne dclarant le
            bloc des instructions qu'ultrieurement.
            - EXTERNAL: permet aux procdures ou fonctions d'tre
            crites dans unautre langage que TML et d'tre
            ensuite linkes avec votre programe TML.
            - INLINE: permet de remplacer les instructions Pascal
            par un code en langage machine 65816.
            - TOOL: dsigne une procdure ou fonction implmentant
            une routine de la boite  outils de l'Apple // GS.

            ````Directive FORWARD:

            Une dclaration procdure ayant la directive FORWARD au lieu du
            bloc d'instructions, est appele une dclaration ultrieure. Quelque
            part aprs la dclaration FORWARD, la procdure sera dfinie par une
            dclaration de dfinition (procdure utilisant le mme identifiant 
de
            procdure et contenant cette fois un bloc d'instructions). La
            dclaration de dfinition peut contenir  nouveau la liste des
            parameters formels, et dans ce cas, cette liste doit tre identique 

            la dclaration FORWARD. La dclartion FORWARD et la dclaration de
            dfinition doivent tre dans la mme partie de dclaration, mais 
            n'ont
            pas besoins d'tre contigues. Ainsi, d'autres procdures, fonctions,
            types ou variables peuvent tre dclares entre elles et peuvent 
            faire
            appel  la procdure en question. La dclaration FORWARD permet la
            rcursivit mutuelle.

            La dclaration FORWARD et la dclaration de dfinition
            constituent la dclaration complte de la procdure. La procdure 
est
            considre comme dclare en lieu et place de la dclaration FORWARD.
            Les procdures et fonctions FORWARD ne peuvent tre dclares dans 
la
            partie INTERFACE d'une UNIT.

            Exemples:

            procedure Proc2 (m,n: integer); forward;

            procedure Proc1 (x,y: real);

            begin
            ...
            Proc2(4,5);
            end;

            procedure Proc2 (m,n: integer);
            begin
            ...
            Proc1(8.3 , 2.4);
            end;

            ````Les directives EXTERNAL:

            Une dclaration de procdure dont le corps est constitu de la
            directive EXETERNAL dfinit l'interface Pascal pour une routine
            assemble ou compile dans un langage autre que TML. Le code externe
            pour la routine doit tre disponible pour le linkage.

            Exemple:

            procdure GotoXY (x,y: integer); External;

            Dans cet exmple, GotoXY est une procdure externe devant tre
            linke au programme principal avant excution.
            C'est au programmeur de s'assurer que les fonctions et procdures
            externes sont compatibles avec leurs dclarations dans le programme
            Pascal. Le linker n'effectue aucun test de compatibilit.

            ````Les directives INLINE:

            Les directives INLINE permettent d'crire du code en langage
            machine  la place du bloc des instructions. Le code machine ne peut
            tre constitu que par une squence de constantes entires 
            repsentant
            un seul octet de langage machine. Lorsque la procdure est appele, 
            le
            compilateur gnre le code machine spcifi par la directive INLINE.
            Si une procdure a des parameters, ils sont empils sur la pile 
avant
            que le code ne soit gnr.
            La directive INLINE a pour but d'crire de petites routines. Par
            exemple, la procdure suivante va effacer le drapeau d'inhibition 
des
            interruptions en gnrant l'instruction CLI:

            procedure GenCli; inline $58;

            ````Les directives TOOL:

            La directive TOOL sert  dfinir le corps d'une procdure par une
            des routines de la boite  outils du GS. La boite  outils du GS est
            divise en plusieurs outils, chacun contenant des routines. Chaque
            outil est identifi par un numro unique, et chaque routine est
            dsigne par une numro unique de fonction. Cette mthode de
            dsignation des routines de la boite  outils permet au TML de 
            gnrer
            le code adquat pour faire appel  une fonction ToolBox. Par 
exemple,
            la procdure MoveTo de l'outil QuickDraw (outil n[ 4) est dsigne 
            par
            la fonction 58. Ainsi la dclaration TOOL se fera par:

            procedure MoveTo (h,v: integer); Tool 4,58;

            ```LES PARAMETRES:

            La dclaration d'une procdure ou d'une fonction spcifie une
            liste de parameters formels. Les parameters dclars dans une liste 
            de
            parameters formels sont locaux  la procdure ou fonction dclare, 
            et
            peuvent tre adresss par leurs identifiants dans le bloc associ  
            la
            procdure ou fonction.

            liste de parameters formels



            --->! ( !----+-->! dclaration des parameters !---+--! ) !-->



            ! 


            +





            dclaration des parameters



            -+


            ! 


            +->! var !---+ 


            ! 


            +->! static !+ !I!



            ---

            Les dclarations de procdures et fonctions peuvent avoir jusqu'
            trois sortes de parameters formels:

            - variable: groupe de parameters prcds par le mot
            VAR
            - valeur : groupe de parameters non prcds par VAR
            - statique: groupe de parameters prcds du mot STATIC

            ````Les parameters VALEURS:

            Un parameter formel valeur se comporte comme une variable locale
             la procdure ou fonction, sauf que sa valeur initiale est donne 
            par
            le parameter actuel correspondant lors de l'activation de la 
            procdure
            ou fonction. Les modifications de la valeur du parameter n'affectent
            pas la valeur du parameter actuel.

            Un parameter valeur correspondant  un parameter actuel dans un
            appel de procdure ou de fonction doit tre une expression, et sa
            valeur ne peut tre un type File ou tout autre type structur 
            conteant
            un type File.

            Le parameter actuel doit tre compatible en assignation avec le
            type du parameter valeur formel. Si le type du parameter est String,
            le parameter formel doit avoir une taille statique de 255.
            Si la taille du parameter formel (en octets) est suprieure  4
            octets, alors le parameter actuel est pass par son adresse et la
            valeur actuelle est copie dans la zone des variables locales.
            Cependant, les assignations au parameter formel n'affectent pas la
            valeur du parameter actuel.
            Les parameters formels et actuels doivent compatibles en
            assignation. Cette restriction peut tre contourne en dclarant le
            parameter sous la forme UNIV (voir l'avant dernier paragraphe de ce
            chapitre).

            ````Les parameters VARIABLE:

            Un parameter Variable est employ lorsque la valeur du parameter
            doit tre passe en retour de la procdure ou fonction. Le parameter
            actuel correspondant dans une instruction d'appel de procdure ou de
            fonction doit tre une rfrence  une variable. Le parameter formel
            Variable reprsente la variable acuelle durant l'activation de la
            procdure ou de la fonction, aussi toute modification de la valeur 
du
            parameter formel est immdiatement transfre au parameter actuel.

            Dans une procdure ou fonction, toute rfrence  un parameter
            formel Variable concerne le parameter actuel. Les parameters actuels
            et formels doivent tre compatibles en assignation. Cette 
restriction
            peuttre contourne en dclarant le parameter sous la forme UNIV 
            (voir
            l'avant dernier paragraphe de ce chapitre). Si le type du parameter
            est String, le parameter formel doit avoir une taille statique de 
            255,
            et le parameter actuel Variable doit tre de type String avec une
            longueur255.

            Les types File ne peuvent tre passs en parameter Variable.
            Les composants des variables des types structurs compacts ne
            peuvent tre utiliss en tant que parameters actuels Variable.
            Si on accde  une variable actuelle par l'indexation  un
            tableau, la recherche de la variable identifie par un pointeur, ou 
            la
            recherche du champ d'un enregistrement, l'action est excute avant
            l'activation de la procdure ou de la fonction. Il faut faire
            attention lors de la recherche de variables reloges dans le segment
            principal. Le compactage de ce segment peut faire dplacer la source
            ce qui produirait des effets surprenants.

            ````Les parameters STATIC:

            Les parameters statiques sont des extensions spcifiques de TML
            pour le //GS. Ils ont t ajouts dans le seul but de permettre la
            production d'un code objet performant. Les parameters statiques sont
            traits de la mme manire que les parameters Valeur avec la
            restriction suivante: une nouvelle valeur ne peut tre assigne  un
            parameter formel statique au sein de la procdure ou fonction.

            Les parameters valeur dont le type formel ncessite plus de 4
            octets de stockage sont passs par leurs adresses puis copis dans 
la
            zone locale de stockage des variables. Ainsi l'assignation de
            nouvelles valeurs au parameter formel valeur ne modifie pas le
            parameter actuel (voir appendix D). Cependant, dans certains cas si 
            le
            parameter formel est uniquement lu (et non crit), il n'y a pas 
            besoin
            de copier le parameter actuel dans la zone local de stockage en vue 
            de
            son utilisation par le parameter formel puisque celui ci peut
            l'adresser directement.
            Les parameters statiques rduisent la taille de la pile requise
            par une application et rduisent galement le temps d'excution
            pusiqu'il n'y a pas besoin de copier la valeur du parameter actuel
            dans la zone locale.
            Attention, TML ne vrifie pas si un parameter statique sera ou
            non r-crit. C'est au programmeur de s'assurer de l'usage correct 
            des
            parameters statiques.

            ````Les parameters UNIV:

            Lorsque le mot UNIV apparait avant l'identifiant de type dans la
            liste des parameters formels, la restriction selon laquelle les
            parameters actuel et formel doivent tre compatibles en assignation
            pour les parameters Valeur, ou identiques si les parameters sont
            Variables, n'a plus lieu. Lorsqu'on utilise UNIV, le parameter 
actuel
            peut tre de n'importe quel type pourvu que le nombre d'octets
            ncessaires au stockage de la valeur du parameter actuel soit le 
mme
            que celui du parameter formel.
            Voici un exemple de parameter UNIV:

            TYPE ptr = *Char; (* est un accent circonflexe)
            VAR aLong: LongInt;
            aPtr : Ptr;

            procedure aProc(p: univ Ptr);
            begin
            end;

            begin
            aProc(aLong);
            aProc(aPtr);
            end.

            ````Compatibilit des listes de parameters:

            La compatibilit des listes de parameters est indispensable pour
            la concordance des listes formelles et actuelles.
            Deux listes de parameters formels sont compatibles si elles
            contiennent le mme nombre de parameters et si les parameters sont 
en
            concordance dans la liste. Deux parameters concordent si une de ces
            conditions est vraie:

            - ce sont des parameters Valeur de type identique.
            - ce sont des parameters variables de ype identique.
            - le parameter formel  UNIV avant son type, et le
            parameter actuel est une valeur ou une variable de
            mme taille. Les parameters doivent tre tous deux
            des valeurs ou des variables.

            ``CHAPITRE 18: PROGRAMMES ET UNITS

            ```INTRODUCTION:

            Le TML offre deux sortes de dfinition du source de vos
            applications: les Programmes et les Unit. La diffrence entre les 
            deux
            est que le programme correspond  une application complte et peut
            donc tre compil et excut. Une Unit ne peut tre excute; c'est
            plutot un assemblage dans lequel des parties de programmes peuvent
            tre dfinies et compiles indpendamment du programme. Les 
            Programmes
            et les Units sont compils sparment. Leurs fichiers objets sont 
            lis
            par le Linker du TML afin de constituer un seul fichier excutable.

            ```LES PROGRAMMES:

            Un Programme Pascal ressemble  une dclaration de procdure si
            ce n'est l'en-tte et la prsence optionnelle de la clause USES.

            programme



            --->! en-tete de !->! ; !-+


            ! programme ! 





            ! USES ! ---




            L'identifiant immdiatement aprs le mot PROGRAM dans l'en-tte
            du programme est un identifiant de programme. Les parameters de
            programme dcrits par Jensen et Wirth et la norme ANS n'ont rien 
            voir avec le TML.

            NOTE: les versions 1.x de TML utilisaient la prsence des mots
            rservs Input et Output dans l'en-tte. Ces mots servaient  
            indiquer
            au compilateur qu'il devait crer un environnement Plain Vanilla. 
            Avec
            TML II, il n'y a plus besoin d'employer ces mots rservs. Afin de
            crer une environnement Plain Vanilla (dsormais appel textbook
            Graphic), il suffit de faire appel  la procdure Graphics.

            en-tte de programme



            -->! PROGRAM !->! identifiant !-+





            +-!(!->! parameters prog. !->!)!-+
            --- 


            parameters de programme 









            ```LA CLAUSE USES:

            La clause USES sert  identifier les Units requises par un
            programme ou une Unit afin de pouvoir procder  la compilation.

            clause Uses 









            Lorsque TML rencontre un identifiant (le nom d'une UNIT) dans une
            clause USES, il doit trouver le code compil correspondant contenant
            la table des symboles et le code objet de l'unit. Pour cela, la 
            chaine
            '.p.o' est ajoute  la fin du nom de l'unit. Par exemple:

            uses Globals, fileStuff;

            fera utiliser les fichiers Globals.p.o et fileStuff.p.o

            La clause USES dans le programme principal rpertorie les Units
            ncessaires au programme. Ces units sont celles utilises 
directement
            par le programme principal et celles utilises par les Units
            elle-mmes.
            Il se peut que le nom du fichier code-objet d'une unit ne
            corresponde pas au nom de l'unit. Dans ce cas, la directive de
            compilation $U permet de spcifier un nom d'unit particulire. La
            directive $U doit se trouver immdiatement avant le nom de l'unit 
            dans
            la clause USES. Par exemple, on aurait pu crire:

            uses globals,
            $U :MyDisk:MyFolder:fileStuff.p.o fileStuff;

            Comme illustr dans cet exemple, la directive $U sert  indiquer
            le prfixe complet d'accs  une unit non situe dans le mme
            directory que le source entrain d'tre compil. La directive $U est
            documente dans l'appendix B.

            Lorsqu'une Unit nomme dans une clause USES utilise d'autres
            Unit, les noms de ces units doivent galement apparaitre dans la
            clause USES et leurs noms doivent prcder celui de l'unit en
            question. Par exemple:

            UNIT UnitA; UNIT UnitB;
            INTERFACE USES UnitA;
            type colors=(red,white,blue); INTERFACE
            IMPLEMENTATION type Rec = record
            END. i : Integer;
            c : colors;
            end;
            IMPLEMENTATION
            END.
            PROGRAM MyProgram;
            USES UnitA, UnitB;
            VAR aRec: Rec;
            BEGIN
            END.

            Dans cet exemple, le programme MyProgram dclare une variable
            aRec de type Rec, qui est dclar dans UnitB. Cependant, une clause
            USES sert  nommer UnitB et cette unit utilise galement une clause
            USES afin de nommer UnitA. Donc, la clause Uses du programme 
            MyProgram
            doit nommer UnitA avant UnitB.
            Si une Unit est recompile, toutes les Units qui l'utilisent
            doivent tre galement recompiles. Ceci afin que les units
            interdpendantes n'essaient pas de rfrencer des dclarations
            devenues inexistantes ou modifies. Par exemple, si UnitB est
            recompil dans notre exemple prcdent, alors MyProgram doit tre
            recompil mais pas UnitA. toutefois, si on modifie UnitA, il faudra
            recompiler UnitB et MyProgram.

            ```LES UNITS:

            Les Units sont la pierre angulaire de la programmation modulaire.
            Les Units sont compiles sparment les unes des autres et sont
            utilises pour organiser les programmes importants en tronons
            logiques. En divisant un programme en plusieurs parties, on rduit
            galement le temps de compilation de chaque partie.
            Voici quelques bonnes raisons d'employer des Units:

            - permettent de rendre modulaire les programmes
            importants
            - permettent de dfinir des dclarations et des blocs
            d'instructions utilisables par diffrents programmes
            - peuvent tre utilises pour faire des parties non
            listables par tout un chacun

            Voici la syntaxe des Units:

            Unit 








            +


            ! 


            +->! partie !-->! partie !->! END !->! . !->
            ! interface ! ! implmentation ! 






            L'identifiant suivant le mot rserv UNIT est l'identifiant
            d'unit. C'est le nom que les autres units et le programme principal
            devront utiliser dans leurs clauses USES

            partie interface 





            !-+





            +->! clause !-+ +-! dclaration !<-+
            ! USES ! 






            La partie Interface d'une Unit dclare les constantes, les types,
            les variables, les procdures et les fonctions publiques. C'est  
            dire
            que les dclarations faites dans la partie Interface sont 
disponibles
            pour les autres Units ou Programmes utilisant le nom de l'unit dans
            leur clause USES. En d'autres termes, le champ de validit des
            dclarations publiques est le programme entier ou les units 
utilisant
            cette unit. Le programme ou l'unit utilisant une unit peut accder 
            aux
            dclarations publiques comme si elles avaient t dclares dans ses
            propres blocs.

            Les dclarations de labels ne sont pas permises dans la partie
            interface d'une Unit. Les procdures et fonctions de la partie
            interface sont dclares uniquement en indiquant le nom des 
            procdures
            ou fonctions, les parameters formels ventuels, et le type de 
            rsultat
            (pour les fonctions). On ne peut mettre de bloc d'instruction pour 
            les
            procdures et fonctions dans la partie interface. A la place,
            l'en-tte de la procdure ou fonction est rpte dans la partie
            IMPLEMENTATION, l o| le code des blocs sont dclars. Les
            dclarations de procdures et fonctions dans la partie INTERFACE se
            comportent comme si la directive FORWARD avait t spcifie.
            Cependant, les dclarations de procdures et fonctions peuvent avoir
            les directives EXTERNAL, INLINE et TOOL dans la partie interface
            puisqu'elles n'ont pas de bloc dans la partie implmentation.

            Les variables, procdures et fonctions apparaissant dans la
            partie interface sont dites GLOBALES. L'unit entire est sous la
            gestion du bloc dans lequel une clause USES rfrence l'unit.

            La partie interface peut contenir une clause USES, et ainsi une
            Unit peut utiliser une autre Unit.

            partie implmentation 








            +-!dclaration!<-+




            La partie implmentation qui suit la dernire dclaration de la
            partie interface, dclare chaque constante, type, varaiable, 
            procdure
            et fonction prives, c'est  dire non disponibles pour le programme 
            ou
            l'unit l'utilisant. Les procdures et fonctions prives sont 
            dclares
            comme des procdures ou fonctions dans les programmes (avec un 
            en-tte
            et un corps).

            Les procdures e fonctions publiques dclares dans la partie
            interface sont redclares dans la partie implmentation. La seule
            exception concerne les procdures et fonctions dclares en 
utilisant
            les directives EXTERNAL, INLINE et TOOL. Les parameters formels et 
            les
            types de rsulat peuvent tre omis, mais s'ils sont indiqus, ils
            doivent l'tre de manire identique  leur dclaration prcdente.

            ``CHAPITRE 19: LES ENTREES-SORTIES

            ```LES ACCES AUX FICHIERS

            Le TML Pascal II gre les accs aux fichiers de deux manires:

            - les routines E/S de la boite  outils du GS
            - les procdures et fonctions propres au TML.

            QuickDraw et l'Event Manager restent les mthodes les plus
            directes pour grer l'cran, le clavier et la souris. Les appels au
            Systme d'Exploitation GS/OS 5.0 permettent galement de manipuler
            aisment les fichiers. L'appendix C contient la liste des fichiers
            interfaces de la boite  outils.
            Les routines internes au TML permettent aussi de manipuler
            facilement les accs aux fichiers. Ce chapitre traite exclusivement 
            de
            cette mthode.

            ```LES FICHIERS EN PASCAL

            Avec le TML Pascal II, les fichiers sont grs  l'aide de
            'variables de fichier'. Une variable de fichier est tout simplement
            une variable dclare pour un type de fichier (voir ch. 13). Le TML
            Pascal II accepte deux types de fichiers:

            - les fichiers texte.
            - les fichiers  structure.

            Les fichiers textes sont dclars avec le type prdfini TEXT.
            Les fichiers textes archivent les donnes sous forme de squences de
            caractres organiss en lignes. Le TML Pascal II dispose de 
plusieurs
            fonctions et procdures spciales pour grer les lignes de texte.

            TML Pascal II pr-dfini deux fichiers textes pour chaque
            programme: Input et Output. Le fichier Input est pr-dfini en 
            lecture
             partir du clavier uniquement, et le fichier Output est pr-dfini 
            en
            criture cran (cran texte ou graphique).

            Les fichiers  structure sont constitus d'une squence de
            composants. Dans un fichier texte, un composant est un caractre; 
            dans
            un fichier  structure, le composant peut tre de tout type autre
            qu'un type de fichier ou qu'un type structur contenant un type de
            fichier. Un seul composant est appel un 'enregistrement logique'.

            Exemples de fichiers:

            var aFile: text;  exemple de fichier texte 
            var aFile: file of integer;  exemple de fichier structure
            

            Les variables fichier se rfrent  des fichiers composs de
            squences de composants. Pour les fichiers texte, ces composants 
sont
            toujours de type 'Char'. Pour les fichiers  structure, le composant
            peut tre n'importe quel type Pascal, sauf un type de fichier ou un
            type structur contenant un fichier. Dans chaque cas, le composant 
            est
            considr comme tant un enregistrement logique. Les fichiers 
peuvent
            avoir n'importe quel nombre d'enregistrements logiques, mais on ne
            peut accder qu' un seul  la fois avec une variable fichier. La
            position, par rapport au dbut du fichier, de l'enregistrement 
            logique
            accessible, s'appelle 'position courante dans le fichier'.

            Avant d'utiliser une variable fichier, il faut l'associer  un
            fichier: c'est ce qu'on appelle 'ouvrir' le fichier. Il y a trois
            procdures d'ouverture de fichier: Reset, Rewrite et Open.

            Note: les variables fichier Input et Output sont pr-dfinies et
            ouvertes automatiquement au lancement du programme.

            Pour ouvrir un fichier, on doit spcifier son nom externe. Ce nom
            peut tre un chemin d'accs GS/OS ou un nom de priphrique.

            ```PROCEDURES ET FONCTIONS STANDARDS POUR TOUS LES FICHIERS

            ````La procdure RESET
            syntaxe: Reset (f [, titre ])

            Reset ouvre en lecture un fichier existant ou 'repositionne' un
            fichier ouvert en remettant la position courante sur le composant 0.
            Le fichier est ouvert uniquement pour des lectures squentielles.
            Lorsqu'un fichier dja ouvert est 'repositionn', son contenu n'est
            pas effac. 'f' est une variable fichier de n'importe quel type de
            fichier; 'titre' est une chaine optionnelle.

            Si 'TITRE' est spcifi dans la liste des parameters, alors RESET
            va ouvrir un fichier existant nomm 'TITRE' puis la variable fichier
            'f' sera associe  ce fichier externe. Si 'TITRE' n'est pas un nom
            compatible GS/OS, ni un nom de priphrique, ou si le fichier ne 
peut
            tre ouvert, une erreur est retourne dans IOResult.

            Si 'TITRE' n'est pas spcifi dans la liste des parameters, alors
            'f' devra dja tre associ  un fichier ouvert. Dans ce cas, RESET
            replace la position courante sur le composaant 0 du fichier. Si 'f'
            n'est pas dja associ  un fichier, alors une erreur est retourne
            dans IOResult.

            ````La procedure REWRITE

            syntaxe: Rewrite (f [, titre])

            Rewrite ouvre en criture un fichier existant, ou cre un nouveau
            fichier, ou 'repositionne' un fichier ouvert en remettant la 
position
            courante sur le composant 0. Le fichier est ouvert uniquement pour 
            des
            critures squentielles. Lorsqu'un fichier dja ouvert est
            'repositionn' avec REWRITE, son contenu est effac. 'f' est une
            variable fichier de n'importe quel type de fichier; 'titre' est une
            chaine optionnelle.

            Si 'TITRE' est spcifi dans la liste des parameters, alors
            REWRITE va crer et ouvrir un nouveau fichier externe nomm 'TITRE'
            puis la variable fichier 'f' sera associe  ce fichier externe. Si 
            le
            fichier existe dja, il est ouvert et son contenu est effac.

            Si 'TITRE' n'est pas spcifi dans la liste des parameters, alors
            'f' devra dja tre associ  un fichier ouvert. Dans ce cas, 
REWRITE
            replace la position courante sur le composaant 0 du fichier. Si 'f'
            n'est pas dja associ  un fichier, alors une erreur est retourne
            dans IOResult.

            ````La procdure OPEN

            syntaxe: Open (f, titre)

            OPEN va ouvrir un fichier existant ou va crer un nouveau
            fichier. Le fichier est ouvert pour des lectures/critures en accs
            alatoire. Lorsqu'un fichier existant est ouvert, son contenu n'est
            pas effac. 'f' est une variable fichier de n'importe quel type de
            fichier; 'titre' est une chaine optionnelle.

            Si 'TITRE' n'est pas un nom compatible GS/OS ni un nom de
            priphrique, ou si le fichier ne peut tre ouvert, une erreur est
            retourne dans IOResult.

            ````La procdure CLOSE

            syntaxe: Close (f)

            CLOSE va fermer le fichier ouvert. 'f' est une variable fichier
            de n'importe quel type de fichier. L'association entre 'f' et le
            fichier externe est supprime, et le systme marque le fichier
            'ferm'.

            ````La procdure EOF

            syntaxe: EOF (f)
            rsultat: Boolean

            Cela retourne l'tat de fin de fichier. 'f' est une variable
            fichier. EOF(f) retourne VRAI si la position courante est aprs le
            dernier composant du fichier; sinon elle retourne FAUX.

            ````La procdure SEEK

            syntaxe: Seek(f, n)

            Change la position courante sur le composant 'n' et lis le nouvel
            enregistrement logique. 'f' est une variable fichier, ',' est une
            expression de type 'LongInt'. Pour les fichiers textes, la taille 
            d'un
            enregistrement logique est 1. Le numro du premier enregistrement
            logique est 0. Si la valeur de 'n' est plus grande que le nombre de
            composants du fichier, alors la position courante est positionne en
            fin de fichier et EOF(f) est VRAI.

            ````La procdure ERASE

            syntaxe: Erase (titre)

            Permet d'effacer un fichier externe. 'titre' est une expression
            de type chaine. Le fichier externe avec le nom 'TITRE' est effac du
            priphrique externe o| il se trouvait.

            ````La procdure IORESULT

            syntaxe: IOResult
            rsultat: Integer

            Cela retourne une valeur entire correspondant  l'tat de la
            dernire opration E/S effectue. La valeur 0 indique une opration
            correctement effectue; une valeur non nulle indique qu'une erreur
            s'est produite.

            Vous remarquerez que IOResult retourne l'tat de la DERNIERE
            operation E/S. Aussi, les deux instructions suivantes ne donnent pas
            les rsultats qu'on pourrait croire:

            Reset(f, 'monFichier');
            Writeln('IOResult pour Reset = ',IOResult);

            L'appel  la fonction IOResult dans la liste de parameter de
            Writeln retourne l'tat de l'opration WRITELN de la chaine 
'IOresult
            pour Reset =' puisque c'est la dernire opration E/S effectue. Si 
            on
            avait voulu retourner l'tat de 'Reset', on aurait du crire:

            Reset(f, 'monFichier');
            svIOResult := IOresult;
            Writeln('IOResult pour Reset = ', svIOResult);

            ````La fonction FILEPOS

            syntaxe: FilePos(f)
            rsultat: LongInt

            Cela retourne la position courante du fichier ouvert 'f'. Le
            premier enregistrement logique dans un fichier est  la position 0.
            Avec les fichiers  structure, un enregistrement logique est une
            occurence du type de composant. Pour les fichiers textes, le type de
            composant est un octet.

            'f' est une variable fichier associe  un fichier devant tre
            ouvert.

            ````La procdure RENAME

            syntaxe: Rename(AncNom, NouvNom)

            Permet de renommer un fichier. 'AncNom' et 'NouvNom' sont des
            expressions de type chaine. Le fichier externe nomm 'AncNom' va 
tre
            renomm en 'NouvNom'. Si aucun fichier ne porte le nom 'AncNom', une
            erreur est retourne dans IOResult.

            ```PROCEDURES STANDARD POUR LES FICHIERS A STRUCTURE

            Les procdures indiques dans ce paragraphe sont utilises pour
            des accs alatoires  des enregistrements logiques de fichiers 
            structure. Le type de composant de ces fichiers peut tre de tout 
            type
            autre qu'un type de fichier ou qu'un type structur contenant un 
type
            de fichier.

            ````La procdure READ pour les fichiers  structure

            syntaxe: Read (f, v1 [, v2, ..., vn])

            Permet de lire un composant de fichier dans une variable. 'f' est
            une variable fichier, et chaque parameter 'v' est une variable du 
            mme
            type que le type du composant du fichier 'f'. Pour chaque parameter
            'v', le composant de fichier  la position courante est lu dans 'v' 
            et
            la position courante est avance au prochain composant. Si on essaie
            de lire aprs la fin de fichier, une erreur est retourne dans
            IOResult.

            La procdure READ est aussi utilise pour les fichiers textes
            (voir plus loin). Avec les fichiers textes, la variable fichier 'f'
            est un parameter optionnel, car si elle est omise, l'instruction 
READ
            effectuera une lecture  partir de l'entre standard (donc le 
            clavier)
            dfinie en type texte. Pour les fichiers  structure, la variable
            fichier est indispensable.

            ````La procdure WRITE pour les fichiers  structure

            syntaxe: Write (f, v1 [, v2, ..., vn])

            Permet d'crire chaque variable 'v' dans un composant de fichier.
            'f' est une variable fichier, et chaque parameter 'v' est une 
            variable
            du mme type que le type du composant du fichier 'f'. Pour chaque
            parameter 'v', la valeur de 'v' est crite sur le composant de 
            fichier
             la position courante, et la position courante est avance au
            prochain composant. Si on essaie d'crire aprs la fin de fichier, 
un
            nouveau composant est ajout en fin de fichier.

            La procdure WRITE est aussi utilise pour les fichiers textes
            (voir plus loin). Avec les fichiers textes, la variable fichier 'f'
            est un parameter optionnel, car si elle est omise, l'instruction 
            WRITE
            effectuera une criture sur la sortie standard (donc l'cran) 
dfinie
            en type texte. Pour les fichiers  structure, la variable fichier 
est
            indispensable.

            ```LES PROCEDURES ET FONCTIONS STANDARD POUR LES FICHIERS TEXTES

            Les fichiers textes se distinguent des autres types de fichier du
            fait qu'ils sont organiss en collections de lignes se terminant
            toutes par un retour chariot. Les fichiers texte sont uniques parmi
            les fichiers dfinis comme 'file of char' car le $#former est 
            organis
            en lignes, tandis que le dernier ne l'est pas forcment.

            Aucune procdure ou fonction dfinie dans ce paragraphe ne
            requiert de variable fichier comme parameter explicite. Si on
            n'indique pas de parameter variable fichier, le fichier pr-dfini
            Input ou Output est pris par dfaut (si on fait une lecture, c'est
            INPUT qui sera pris par dfaut; autrement ce sera OUTPUt).

            ````La procdure READ pour les fichiers textes

            syntaxe: Read ([f, ] v1 [, v2, ..., vn])

            Lis une ou plusieurs valeurs d'un fichier texte dans les
            parameters V1,... correspondants. Si la variable 'f' est indique,
            elle doit tre de type texte. Si on ne spcifi pas 'f', le fichier
            standard Input est pris par dfaut, qui est le clavier. Chaque
            variable 'v' est de type Integer, Longint, Real, Char ou String.

            lire une variable Char: pour les variables de type Char, la
            procdure Read lit un caractre du fichier et l'assigne  la
            variable. Si Eof(f) tait VRAI avant la lecture, alors la
            valeur Chr(0) est retourne. Si Eoln(f) tait VRAI avant la
            lecture, alors la valeur Chr(13) est retourne. La prochaine
            lecture aura lieu  partir du prochain caractre dans le
            fichier.

            lire une variable LongInt ou Integer: avec une variable Integer
            ou LongInt, on lit des squences de caractres formant un
            nombre sign. Les espaces, tabulations et fin de lignes sont
            sautes jusqu' ce qu'on tombe sur le dbut d'une chaine
            numrique. Ds lors, tous les caractres autres que
            'espace', 'tabulation' ou 'fin de ligne' sont considrs
            comme faisant partie de la chaine numrique. La chaine est
            alors interprte sous forme de valeur numrique. Si aucun
            caractre de la chaine ne reprsente un nombre sign, alors
            une erreur est retourne par IOResult. La prochaine lecture
            se fera ensuite  partir du caractre terminant la chaine
            numrique.

            lire une variable Real: avec les variables Real, on lit une
            squence de caractres formant un nombre sign en virgule
            flottante. Tous les espaces, tabulations ou fin de ligne
            sont sauts jusqu' ce qu'on tombe sur le dbut d'une chaine
            numrique. Ds lors, tous les caractres autres que
            'espace', 'tabulation' ou 'fin de ligne' sont considrs
            comme faisant partie de la chaine numrique. La chaine est
            alors interprte sous forme de valeur numrique. Si aucun
            caractre de la chaine ne reprsente un nombre rel, alors
            une erreur est retourne par IOResult. La prochaine lecture
            se fera ensuite  partir du caractre terminant la chaine
            numrique.

            lire une variable String: avec une variable String, on lit tous
            les caractres dans la variable chaine jusqu'au prochain
            caractre 'fin de ligne' (celui-ci n'tant pas lu). La
            prochaine lecture commencera  partir de ce caractre 'fin
            de ligne'. Remarquez que des lectures successives de type
            String, ne vont pas effectuer des lectures succesives de
            lignes puisque une lecture de type String ne passe JAMAIS
            aprs le caractre 'fin de ligne'.

            ````La procdure READLN

            syntaxe: Readln([f,] v1 [,v2,...,vn])

            Cette procdure est une extension de la procdure READ. Aprs
            avoir effectu le mme travail que READ, alors READLN passe au dbut
            de la prochaine ligne du fichier en sautant tous les caractres
            jusqu' ce qu'un 'fin de fichier' soit effectivement lu. S'il n'y a
            pas d'autre ligne, EOF(f) devient VRAI. Bien entendu, si on ne
            spcifie pas 'f', c'est le fichier standard Input qui est pris par
            dfaut.

            ````La procdure WRITE avec les fichiers textes:

            syntaxe: Write ([f,] v1 [,v2,...,vn])

            Ecris une ou plusieurs valeurs dans un fichier de type texte. Si
            F n'est pas indiqu, le fichier standard Output est utilis, qui est
            gnralement l'cran du moniteur //GS. Chaque valeur v peut tre une
            expression de type entier, entier long, rel, caractre, boolen ou
            chaine.
            Les parameters v sont appels parameters d'criture. Chaque
            parameter d'criture est de la forme:

            OutExpr [: MinWidth [: DecPlaces]]

            OutExpr: est une expression d'un type autoris.
            MinWidth et DecPlaces sont des expressions avec des valeurs de
            type entier. MinWidth indique la largeur minimum du champ; il doit
            tre plus grand ou gal  0. Il y aura exactement MinWidth 
caractres
            cris (avec des espaces en en-tte si ncessaire), sauf si OutExpr a
            une valeur ne pouvant tre reprsente qu'avec plus de caractres 
que
            MinWidth; dans ce cas, le nombre ncessaire de caractres pour
            reprsenter OutExpr est crit. De la mme manire, si MinWidth n'est
            pas spcifi, chaque OutExpr sera crite avec le nombre ncessaire 
de
            caractres pour la reprsenter.
            DecPlaces indique le nombre de dcimales dans la reprsentation
            des rels. On ne peut l'employer que si OutExpr est de type rel, et
            si MinWidth est galement indiqu. Si on l'utilise, il doit tre
            suprieur  0. Si on n'indique pas DecPlaces, OutExpr est crit en
            reprsentation virgule flottante.

            ````La procdure WRITELN:

            syntaxe: Writeln ([f,] v1 [,v2,...,vn])

            Cette procdure est une extension de la procdure Write. Aprs
            avoir effectu la mme opration que Write, la procdure Writeln 
            envoi
            un caratre Fin-de-ligne (retour chariot) vers le fichier.

            ````La fonction EOLN:

            syntaxe: Eoln [(f`]
            rsultat: boolean

            Retourne l'indicateur Fin-de-ligne pour un fichier. F doit tre
            dclar comme fichier de type Text. Eoln(f) retourne TRUE si le
            caractre actuellement lu est un caractre Fin-de-ligne, ou si Eof 
            (f)
            est TRUE; autrement le rsultat est FALSE.

            ````La procdure PAGE:

            syntaxe: Page [(f)]

            Ecrit un caractre de saut de page dans un fichier texte. F doit
            tre dclar comme fichier de type texte. Si on ne le spcifie pas, 
            le
            fichier standard Output est utilis.

            ```LES FICHIERS DISQUES ET LE TML PASCAL:

            Lorsqu'on indique un fichier externe dans une procdure TML
            Pascal, le nom d'accs complet doit tre spcifi comme nom de
            fichier. Un nom d'accs complet est constitu du nom de fichier
            ventuellement prcd par le nom de volume et un ou plusieurs nom 
de
            dossiers. Les noms de volumes, de dossiers et du fichier sont 
spars
            alors par des (:). Exemple:

            MyVolume:MyDir1: ...:MyDirN:MyFile

            Cependant, on peut galement utiliser l'ancienne syntaxe
            ProDos16, et mettre un (/)  la place des (:). Exemple:

            MyVolume/MyDir1/ .../MyDirN/MyFile

            (Voir le manuel GS/OS reference pour plus amples informations).

            ```LES PERIPHERIQUES ET TML PASCAL:

            En plus des fichiers disques externes, TML Pascal accepte des
            priphriques comme port d'entre/sortie. Ces priphriques doivent
            tre des priphriques reconnus par GS/OS: clavier, cran,
            imprimante... Lors du lancement du programme, Clavier et Ecran sont,
            respectivement, les fichiers standard Entre et Sortie.
            L'imprimante est aussi disponible comme priphrique texte, mais
            elle doit tre explicitement ouverte avec la procedure REWRITE
            utilisant le nom de device ".PRINTER". Exemple:

            PROGRAM TestPrinter;
            var f: Text;
            begin
            Rewrite(f,'.PRINTER');
            for i:=1 to 10 do
            Writeln(f,'bonjour l''imprimante');
            Close(f);
            end;

            ``CHAPITRE 20: PROCEDURES STANDARDS ET FONCTIONS

            Ce chapitre dcrit les procdures standard pr-dfinies ainsi que
            les fonctions du TML II,  l'exception des procdures et fonctions
            d'entre/sortie dcrites au chapitre 19.
            Les procdures et fonctions standards sont pr-dfinies. Cela
            signifie qu'elles fonctionnent comme si elles taient dclares dans
            une Unit annexe. Il n'y a aucun conflit dans une dclaration
            redfinissant le mme identifiant dans un programme, mais dans ce 
cas
            la procdure ou fonction pr-dfinie est masque. A noter que les 
les
            procdures et fonctions pr-dfinies ne peuvent tre employes comme
            parameters de procdures ou fonctions.

            ```La procedure GRAPHICS:

            syntaxe: Graphics(screenMode: integer);

            La procdure Graphics sert  initialiser l'environnement //GS.
            Cette procdure doit tre appele au tout dbut du corps du 
            programme.
            Cette procdure initialise les outils QuickDraw et EventManager et
            commute l'cran en mode SHGR 640 ou 320, selon la valeur de
            ScreenMode. L'cran peut tre utilis comme Entre/Sortie standard
            pour les procdures Readln, Writeln et autres routines I/O. Des
            graphismes QuickDraw peuvent galement tre dessins sur cet cran.
            La procdure Graphics est fournie dans TML II afin de simplifier
            l'accs au dessin. La programmation dans le mode graphique est
            explicite au chapitre 7.

            ```Le droulement des Procdures de Controle:

            Les procdures dcrites dans ce chapitre permettent un
            branchement immdiat  une partie de programme.

            ````La procdure EXIT:

            syntaxe: Exit (id)

            La procdure Exit interrompt l'excution d'un bloc de programme:
            un bloc tant une fonction, une procdure ou le programme entier. De
            manire gnrale, elle est quivalente  un GOTO vers un label situ 
            
            la fin du bloc identifi par ID.

            ````La procdure HALT:

            syntaxe: Halt

            La procdure Halt interrompt l'excution du programme.

            ````La procdure CYCLE:

            syntaxe: Cycle

            La procdure Cycle fait passer immdiatement  la fin de la
            boucle en cours et l'excution se poursuit ensuite avec la prochaine
            valeur de la boucle. Cette procdure n'a de sens que dans des 
boucles
            WHILE, FOR ou REPEAT; dans les autres cas, elle est sans effet. Voir
            le chapitre 16 pour plus de renseignements.

            ````La procdure LEAVE:

            syntaxe: Leave

            La procdure Leave permet de passer immdiatement  l'instruction
            immdiatement aprs la boucle en cours. Cette procdure n'a de sens
            que dans des boucles WHILE, FOR ou REPEAT; dans les autres cas, elle
            est sans effet. Voir le chapitre 16 pour plus de renseignements.

            ```Procdures et fonctions d'ALLOCATION DYNAMIQUE:

            Ces procdures servent  grer une zone mmoire non alloue lors
            de l'excution du programme. Cette procdure utilise les
            fonctionnalits du MemoryManager afin de rcuprer de la mmoire
            libre.

            ````La procdure NEW:

            syntaxe: New(p)

            New(p) cre une variable de type P et lui fait rfrencer P. P
            peut tre un pointeur de tout type. La valeur de P est rfrence 
par
            p*. (attention: cette * est un accent circonflexe)
            New utilise la fonction NewHandle pour trouver une zone mmoire
            libre et elle retourne un pointeur sur le bloc mmoire allou.
            On obtient un code d'erreur si la zone rserve est insuffisante
            pour contenir la nouvelle variable. Dans ce cas, p contient nil et 
la
            fonction HeapResult contient un code d'erreur.

            ````La procdure DISPOSE:

            syntaxe: Dispose(p)

            Dispose(p) dtruit une variable dynamique rfrence par p et
            libre la zone mmoire qu'elle occupait. P doit tre une variable
            prcdemment cre par New(p) ou assigne  une valeur par une
            instruction d'assignation. Dsormais, la valeur de P devient 
            indfinie
            et on a une erreur si on se rfre  une valeur prcdemment 
associe
             p.

            ```LES FONCTIONS DE TRANSFERT:

            Ces fonctions sont utilises pour transfrer une valeur d'un type
             un autre. Remarquez que les procdures standard Pack et Unpack du
            Pascal ne sont pas implmentes dans le TML.

            ````La fonction TRUNC:

            syntaxe: Trunc(x)
            rsultat: LongInt

            Trunc(x) retourne une valeur LongInt de la variable relle x,
            tronque  la valeur entire la plus proche comprise entre 0 et x
            inclus.
            On a une erreur si le rsultat de cet arrondissement est hors des
            limites -maxlongint-1..maxlongint.

            ````La fonction ROUND:

            syntaxe: Round(x)
            rsultat: LongInt

            round(x) retourne une valeur LongInt de la variable relle x
            arrondie  l'entier le plus proche. Si x est exactement  mi-chemin 
            de
            deux entiers, le rsultat est l'entier ayant la plus grande valeur
            absolue.
            On a une erreur si le rsultat de cet arrondissement est hors des
            limites -maxlongint-1..maxlongint.

            ````La fonction ORD4:

            syntaxe: Ord4(x)
            rsultat: LongInt

            Ord4(x) retourne le nombre ordinal d'une valeur de type pointeur
            ou ordinal. Ord4 correspond  Ord, sauf que le type du rsultat est
            LongInt.

            ````La fonction POINTER:

            syntaxe: Pointer(x)
            rsultat: pointeur de type anonyme

            Pointer convertis une valeur Integer ou LongInt en un type
            pointeur. La valeur retourne par Pointer(x) est un pointeur sur
            l'adresse physique o| se trouve la valeur de x. Ce pointeur est du
            mme type que nil en ce sens qu'il est compatible avec tout type de
            pointeur. La valeur de Pointer(0) est nil.

            ```LES FONCTIONS ET PROCEDURES ARITHMETIQUES:

            Les fonctions et procdures arithmtiques effectuent des
            oprations sur des valeurs de type entier ou rel. L'implmentation 
            de
            ces routines peut se faire avec le compilateur TML ou avec les
            fonctions de l'outil SANE.

            ````La procdure INC:

            syntaxe: Inc(x)

            Incrmente de 1 la variable x de type Integer ou LongInt.

            ````La procdure DEC:

            syntaxe: Dec(x)

            Dcrmente de 1 la variable x de type Integer ou LongInt.

            ````La fonction ABS:

            syntaxe: Abs(x)
            rsultat: du mme type que le parameter

            Retourne la valeur absolue de x; c'est  dire que si x est
            ngatif, on rcupre -x; autrement on rcupre x. x est un argument 
            de
            type Integer ou Real.

            ````La fonction SQRT:

            syntaxe: Sqrt(x)
            rsultat: tendu

            Si x n'est pas ngatif, la valeur retourne est de type tendu et
            correspond  la racine carre de x. Si x est ngatif, un diagnostic
            NaN (Not a Number) est gnr et un indicateur d'opration illgale
            est positionn (voir Apple Numrics Manual).

            ````La fonction ODD:

            syntaxe: Odd(x)
            rsultat: boolean

            Retourne TRUE si x est impaire (non divisible par 2 sans reste).
            Si x est paire, la fonction retourne FALSE. x est une expression de
            type ordinal.

            ````La fonction SIN:

            syntaxe: Sin(x)
            rsultat: tendu

            Retourne le sinus trigonomtrique de x. X est une expression de
            type rel et doit reprsenter un angle en radians. Si x est infini, 
            un
            diagnostic NaN est produit et l'indicateur d'opration invalide est
            positionn.

            ````La fonction COS:

            syntaxe: Cos(x)
            rsultat: tendu

            Retourne le cosinus trigonomtrique de x. X est une expression de
            type rel et doit reprsenter un angle en radians. Si x est infini, 
            un
            diagnostic NaN est produit et l'indicateur d'opration invalide est
            positionn.

            ```La fonction EXP:

            syntaxe: Exp(x)
            rsultat: tendu

            Retourne la valeur de e puissance x (e tant la base des
            logarithmes naturels). Si un dpassement de virgule flottante se
            produit, le rsultat est +inf. X est une expression de type rel.

            ````La fonction LN:

            syntaxe: Ln(x)
            rsultat: tendu

            Ln(x) retourne le logarithme naturel de x. X est une expression
            de type rel. Si x est ngatif, un diagnostic NaN est gnr et
            l'indicateur d'opration invalide est positionn.

            ````La fonction ARCTAN:

            syntaxe: Arctan(x)
            rsultat: tendu

            Retourne la valeur Arctangente de x. X est une expression de type
            rel. Toutes valeurs numriques entre + et - inf sont valables.

            ```LES FONCTIONS ORDINALES:

            Les fonctions ordinales dcrites dans ce chapitre se rapportent 
            des valeurs ordinales de types scalaires ou pointeurs. Voir le
            chapitre 13 pour les informations sur les types scalaires et
            pointeurs.

            ````La fonction ORD:

            syntaxe: Ord(x)
            rsultat: Integer ou LongInt

            Ord retourne la valeur ordinale d'un scalaire ou d'un pointeur.
            Si x est de type entier ou long, le type du rsultat sera identique 

            celui de x. Si x est de type pointeur, le rsultat est l'adresse
            correspondante de la variable dynamique pointe par x, de type
            LongInt. Si x est de type ordinal, le rsultat est de type entier et
            la valeur est l'ordinal de x. La procdure standard Ord4 doit tre
            utilise si on veut un rsultat de type LongInt, quelquesoit le type
            de x.

            ````La fonction CHR:

            syntaxe: Chr(x)
            rsultat: Char

            Retourne la valeur Char dont l'ordinal est x. Pour toute valeur
            char ch, on a toujours: chr(ord(ch))= ch.

            ````La fonction SUCC:

            syntaxe: Succ(x)
            rsultat: le mme que le parameter

            Retourne le successeur de x. Une erreur se produit si x est la
            dernire valeur autorise dans le type (c'est  dire qu'il n'a pas 
de
            successeur).

            ````La fonction PRED:

            syntaxe: Pred(x)
            rsultat: le mme que le parameter

            Retourne le prdecesseur de x. Une erreur se produit si x est la
            premire valeur autorise dans le type (c'est  dire qu'il n'a pas 
de
            prdecesseur).

            ```LES FONCTIONS ET PROCEDURES DE CHAINES:

            Les fonctions et procdures chaines n'acceptent pas de parameters
            de type Packed Array of Char, mais uniquement des types String.

            ````La fonction LENGTH:

            syntaxe: Length(str)
            rsultat: Integer

            Retourne la longueur dynamique d'une chaine.

            ````La fonction POS:

            syntaxe: Pos(substr, str)
            rsultat: Integer

            Pos(substr, str) recherche la sous-chaine Substr dans la chaine
            Str, et retourne une valeur entire correspondant  l'index du 
            premier
            caractre de Substr dans Str. Si Substr n'est pas trouv dans Str, 
la
            fonction retourne 0.

            ````La fonction CONCAT:

            syntaxe: Concat(str1 [, str2,...strn])
            rsultat: type String anonyme

            La fonction Concat permet de concatner les parameters dans
            l'ordre de leur passage et de retourner une chaine unique. La chaine
            rsultante ne peut excder 255 caractres de long.

            ````La fonction COPY:

            syntaxe: Copy(source, index, count)
            rsultat: type String

            La fonction Copy retourne une chaine contenant Count caractres
            de la chaine Source  partir de source[index].

            ````La procdure DELETE:

            syntaxe: Delete( dest, index, count)

            La procdure Delete ote Count caractrees de la chaine Dest 
            partir de Dest[index].

            ````La procdure INSERT:

            syntaxe: Insert (source, dest, index)

            La procdure Insert insre la chaine Source dans la chaine Dest,
            le premier caractre de Source devenant dest[index].

            ```FONCTIONS ET PROCEDURES LOGIQUES:

            Ce chapitre dcrit les manipulations sur les bit; ces routines
            correspondent  certaines instructions quivalentes du 65816.

            ````La fonction BAND:

            syntaxe: BAnd(arg1, arg2)
            rsultat: Integer ou LongInt

            BAnd retourne le ET logique de ses deux arguments. Arg1 et Arg2
            sont deux expresions de type scalaire.

            ````La fonction BOR:

            syntaxe: BOr(arg1, arg2)
            rsultat: Integer ou LongInt

            BOr retourne le OU logique de ses deux arguments. Arg1 et Arg2
            sont deux expresions de type scalaire.

            ````La fonction BXOR:

            syntaxe: BXor(arg1, arg2)
            rsultat: Integer ou LongInt

            BXor retourne le OU EXCLUSIF logique de ses deux arguments. Arg1
            et Arg2 sont deux expresions de type scalaire.

            ````La fonction BNOT:

            syntaxe: BNot(arg)
            rsultat: Integer ou LongInt

            BNot retourne la ngation logique de son argument (son complment
             1). Arg est une expresion de type scalaire.

            ````La fonction BSL:

            syntaxe: BSL(arg)
            rsultat: Integer ou LongInt

            BSL dcale  gauche les bits de Arg. Arg est une expresion de
            type scalaire. Un zro est introduit dans le bit faible.

            ````La fonction BSR:

            syntaxe: BSR(arg)
            rsultat: Integer ou LongInt

            BSR dcale  droite les bits de Arg. Arg est une expresion de
            type scalaire. Un zro est introduit dans le bit fort.

            ````La fonction BROTL:

            syntaxe: BRotL(arg)
            rsultat: Integer ou LongInt

            BRotL effectue une rotation  gauche des bits de Arg. Arg est une
            expresion de type scalaire. Le bit de poids fort est r-introduit  
            la
            place du bit de poids faible.

            ````La fonction BROTR:

            syntaxe: BRotR(arg)
            rsultat: Integer ou LongInt

            BRotR effectue une rotation  droite des bits de Arg. Arg est une
            expresion de type scalaire. Le bit de poids faible est r-introduit 

            la place du bit de poids fort.

            ````La fonction HIWRD:

            syntaxe: HiWrd(arg)
            rsultat: Integer

            HiWrd retourne le mot de poids fort du scalaire ou du pointeur
            Arg, c'est  dire les bits 31-16 d'un LongInt. Si Arg n'est pas une
            valeur sur 32 bits, HiWrd retourne 0. Lorsque cet argument est une
            variable simple ou un tableau, aucun code n'est gnr par la 
            fonction
            car l'argument est seulement adress et utilis comme Integer.

            ````La fonction LOWRD:

            syntaxe: LoWrd(arg)
            rsultat: Integer

            LoWrd retourne le mot de poids faible du scalaire ou du pointeur
            Arg, c'est  dire les bits 15-0 d'un LongInt. Lorsque cet argument 
            est
            une variable simple ou un tableau, aucun code n'est gnr par la
            fonction car l'argument est seulement adress et utilis comme
            Integer.

            ```FONCTIONS ET PROCEDURES DIVERSES:

            Ce chapitre dcrit les fonctions et procdures manipulant les
            octets ainsi que les routines travaillant sur des Packed Array of
            Char.
            Les routines manipulant les octets permettent  un programme de
            considrer une variable comme une squence d'octets, sans se soucier
            des types de donnes. Les routines manipulant les octets sont:
            MoveLeft, MoveRight et SizeOf.

            Les routines travaillant avec des Packed Array of Char sont:
            ScanEq, ScanNE et FillChar. Les parameters de ces routines ne 
peuvent
            tres indics et les routines commencent toujours au premier 
            caractre
            du tableau.

            ````La fonction SIZEOF:

            syntaxe: SizeOf(id)
            rsultat: LongInt

            Retourne le nombre d'octets occups par la variable ou le type
            ID. La valeur de SizeOf est dtermine par le compilateur Pascal qui
            la traite comme une constante lors de la compilation.

            ````La fonction CARD:

            syntaxe: Card(s)
            rsultat: Integer

            Dcompte le nombre d'lments dans s et retourne une valeur
            entire reprsentant la cardinalit de s, c'est  dire le nombre
            d'lments.

            ````La procdure MOVELEFT:

            syntaxe: MoveLeft (source, dest, count)

            MoveLeft copie un bloc de Count octets conscutifs  partir de
            Source et vers Dest, en commenant par l'adresse la plus basse 
(c'est
             dire le premier octet de Source et Dest). Source et Dest sont des
            variables de tout type autre que File ou qu'une structure contenant 
            un
            type File. Count est une expression entire dont la valeur n'est pas
            vrifie. Si Source et Dest se chevauchent, vous ne pouvez utiliser
            cette procdure que si Source est  l'adresse la plus haute.

            ````La procdure MOVERIGHT:

            syntaxe: MoveRight (source, dest, count)

            MoveRight copie un bloc de Count octets conscutifs  partir de
            SOurce et vers Dest, en commenant par l'adresse la plus haute 
(c'est
             dire le dernier octet de Source et Dest). Source et Dest sont des
            variables de tout type autre que File ou qu'une structure contenant 
            un
            type File. Count est une expression entire dont la valeur n'est pas
            vrifie. Si Source et Dest se chevauchent, vous ne pouvez utiliser
            cette procdure que si Source est  l'adresse la plus basse.

            ````La procdure FILLCHAR:

            syntaxe: FillChar(dest, count, ch)

            FillChar remplit un bloc de Count caractres conscutifs avec le
            caractre CH, en commenant  l'adresse de dbut de Dest. Dest est 
            une
            variable de type Packed Array of Char. Count est une expression
            entire dont la valeur n'est pas vrifie. CH est une valeur de type
            Char.

            ````La fonction SCANEQ:

            syntaxe: ScanEq( limit, ch, source)
            rsultat: Integer

            ScanEq scrute un bloc de mmoire en commenant  Source et
            recherche la premire occurence de CH. La fonction est active 
jusqu'
            ce que CH soit trouv, o| que l'on a analys Limit octets. Si CH 
            n'est
            pas trouv dans la limite indique, la valeur retourne est gale 
            Limit. Autrment, la valeur retourne correspond au nombre d'octets
            analyss avant que CH n'ait t trouv.
            Limit est une expression entire coupe  16 bits et non
            vrifie. Ch est de type Char; Source est une variable avec une 
            valeur
            de type Packed Array of Char.

            ````La fonction SCNANE:

            syntaxe: ScanNe( limit, ch, source)
            rsultat: Integer

            ScanNe fonctionne de la mme manire que ScanEq,  la diffrence
            qu'elle recherche le premier caractre DIFFERENT de ch.

            ```LA GESTION DES ERREURS D'APPEL A LA BOITE A OUTILS:

            La boite  outils de L'Apple //Gs obit  une convention de
            traitement des erreurs survenant lors de l'appel  une fonction
            ToolBox. Si une erreur est dtecte lors de l'excution d'une 
routine
            ToolBox, le 65816 met la carry  1 et l'accumulateur contient le 
code
            d'erreur correspondant. Le Pascal TML permet de rcuprer ces
            informations dans vos programmes.

            ````La fonction ISTOOLERROR:

            syntaxe: IsToolError
            rsultat: Boolean

            Retourne TRUE si la dernire fonction ToolBox appele  provoqu
            une erreur; sinon elle retourne FALSE. Cette fonction teste le bit 
de
            carry du 65816 pour savoir si une erreur s'est produite. La fonction
            doit tre appele IMMEDIATEMENT aprs l'appel  la fonction avant
            qu'une autre opration n'affecte le bit de carry du 
micro-processeur.
            Si l'appel  la ToolBox est une fonction se trouvant dans une
            expression, le rsultat de IsToolError peut tre incorrect puisque
            l'valuation de l'expression peut modifier la carry. Dans ce cas, le
            programme doit tester la variable _ToolErr.

            ````La variable _TOOLERR:

            syntaxe: _ToolErr
            type: Integer

            La variable _ToolErr contient le code d'erreur retourn par le
            dernier appel  une fonction ToolBox. Une valeur diffrent de 0
            indique une erreur. Le compilateur gnre un code stockant le 
contenu
            de l'accumulateur dans la variable _ToolErr immdiatement aprs
            l'appel  la boite  outils, et avant qu'une autre opration 
n'altre
            cette valeur.

            Exemple d'emploi de IsToolError et de _ToolErr:

            h := NewHandle(100,myMemoryID,0,Ptr(0));
            if IsToolError then begin
            theErr:=_ToolErr;
            Writeln('Erreur d'allocation mmoire:',theErr);
            end;

            Remarquez que _ToolErr a t sauv dans une variable temporaire
            avant l'appel  la procdure Writeln. Ceci est ncessaire car la
            procdure Writeln fait appel  plusieurs fonctions ToolBox qui
            altreraient le contenu de _ToolErr et donneraient donc un rsultat
            erron.
            Plusieurs fonctions ToolBox sont conues pour ne pas gnrer
            d'erreur, mais TML ne le sait pas et il gnre donc le code
            correspondant  la sauvegarde du code d'erreur. Si une application 
ne
            veut pas que ce code de gestion d'erreur soit gnr, il faut mettre
            la directive $ToolErrorCheck-. Voir l'appendix B pour plus de
            renseignements.

            Note: les verions 1.x de TML utilisaient la variable ToolErrorNum 
            pour
            retourner les erreurs produites lors des appels  la boite  outils.
            Cette variable est galement disponible dans TML II, mais il est
            prfrable d'utiliser _ToolErr dans un souci de standardisation.

            ``APPENDIX A: LES MESSAGES D'ERREUR

            Cet appendix rpertorie les erreurs possibles en TML Pascal que
            ce soit dans l'diteur, le compilateur ou le linker; ainsi que pour
            les erreurs GS/OS et I/O. Certaines explications sont parfois 
            fournies
            afin de mieux expliquer pourquoi et comment le message est gnr; 
et
            quelquefois il est indiqu comment corriger l'erreur.
            Certains messages contiennnet le caractre "*" qui signifie que
            dans le message que vous verrez  l'cran, TML utilisera un
            identifiant, un label ou une valeur.

            ```LES ERREURS D'EDITION:

            - Memory is getting low. Close a document window:

            TML dtecte que la mmoire est pleine et avant que certaines de
            vos donnes ne soient perdues, il vous conseille de faire une
            purge de la mmoire en fermant un document. On peut aussi choisir
            RELEASE MEMORY dans le menu Preferences.

            - Can't open that file. The file already open in another window:

            On ne peut avoir deux fois le mme document  l'cran.

            - Error reading file:

            Une rreur s'est produite lors de la lecture du document sur
            disquette. Cela se produit si le fichier est endommag ou si la
            disquette a t ote du lecteur.

            - error saving file:

            Cette erreur survient si TML ne peut sauver le document sur
            disque. Ceci se produit si la disquette est verrouille, ote du
            lecteur ou si elle est pleine.

            - Error deleting file:

            Cette erreur survient si vous choisissez DELETE dans le menu
            GS/OS et que la disquette a t ote du lecteur ou si elle est
            verrouille.

            - Error renaming file:

            Cette erreur survient si vous avez choisi de renommer un fichier
            avec la commande RENAME du menu GS/OS, et que soit vous avez
            donn un nom illgal, soit la disquette a t ote ou soit le
            disque est verrouill.

            - Insufficient memory to complete that operation:

            Lorsqu'une opration n'a pu se faire du fait d'un manque de
            mmoire libre.

            ```LES ERREURS DE COMPILATION:

            ````Les erreurs lexicales:

            - String constant must not exceed source line:

            Une constante chaine ne se termine pas par les guillemets de
            cloture.

            - Error in numeric litteral:

            La syntaxe d'une valeur littrale numrique est incorrecte.

            - Illegal character in input:

            Un caractre illgal a t lu dans le fichier source.

            - Incomplete program:

            La fin de fichier est atteinte avant que le Programme ou l'Unit
            ne soit termin normalement par un point.

            - End of file encountered while reading a comment:

            Le compilateur TML est arriv  la fin du fichier sans avoir
            trouv la fin de commentaire. Tout commentaire doit commencer par
             ou (* et se teminer par  ou *). Voir le chapitre 11.

            ````Les erreurs de syntaxe:

            Ces messages d'erreur signifient que votre programme contient des
            syntaxes interdites. Bien que le message d'erreur vous suggre le
            symbole manquant dans l'expression illgale, il est possible que
            l'erreur soit due  autre chose. Pour cela, voir les chapitres 11  
            20
            pour vous familiariser avec la syntaxe du Pascal.

            - Identifier expected: il faut un identifiant.
            - Unexpected symbol: symbole non plac correctement.
            - Integer constant expected: il faut mettre une constante entire.
            - Error in statement: instruction incorrecte.
            - Error in expression: expression incorrecte.
            - BEGIN expected: il manque l'instruction BEGIN.
            - DO expected: il manque l'instruction DO.
            - END expected: il manque l'instruction END.
            - IMPLEMENTATION expected: il manque la directive IMPLEMENTATION 
dans
            l'Unit.
            - INTERFACE expected: il manque la directive INTERFACE dans l'Unit.
            - OF expected: il manque l'instruction OF.
            - PROGRAM or UNIT expected: il manque la directive PROGRAM ou UNIT 
en
            dbut de document.
            - THEN expected: il manque l'instruction THEN dans une condition IF.
            - TO or DOWNTO expected: il manque l'instruction TO ou DOWNTO dans 
            une
            boucle FOR.
            - UNTIL expected: il manque l'expression UNTIL dans une boucle 
            REPEAT.
            - ) : [ ] ; = , .. . := expected.

            ````Les erreurs smantiques:

            - Duplicate identifier:

            Lorsque le mme identifiant est dclar plusieurs fois dans le
            mme bloc.

            - Low bound exceeds high bound:

            Dans une dclaration de tableau, l'indice est infrieur est
            dclar plus lev que l'indice suprieur.

            - Identifier is not of appropriate class:
            - Identifier not declared:
            - Sign not allowed:
            - Incompatible subrange types:
            - File not allowed here:
            - Tagfield must be scalar or subrange:
            - Index type muste be scalar or subrange:
            - Base type must be scalar or subrange:

            Le type spcifi doit tre un scalaire ou un type tel que
            Integer, Char, Boolean ... Le type ne peut pas tre Real.

            - Error in type of standard subprogram parameter:

            Lorsque le type d'une expression passe en parameter  une
            procdure ou fonction pr-dfinie de TML, est incorect. Voir les
            chapitres 19 et 20.

            - Repetition of parameter list is not identical to previous
            declaration:

            Lorsqu'une liste de parameters pour une fonction ou une procdure
            dclare FORWARD est rpte, ou lorsque dans une interface Unit
            elle ne correpond pas  la dclaration.

            - File value parameter not allowed:

            Les parameters de fichiers doivent toujours tre spcifis par
            VAR.

            - LongInt case/control variable/index expression are not 
implemented:

            TML ne permet pas l'utilisation d'expressions dont le type est
            LongInt dans des expressions Case, des variables de controle de
            boucle ou des tableaux indexs.

            - Missing result type in function declaration: le type du rsultat 
de
            la fonction n'est pas dclar.
            - Fixed point formatting allowed only for real types: point dcimal
            uniquement pour les rels.
            - Number of parameters does not agree with declaration: le nombre de
            parameters ne correspond pas avec la dclaration.
            - Actual parameter may not be PACKED for VAR formal parameter: le
            parmtre ne doit pas tre compact pour la dclaration VAR.
            - Operands are not assignement compatible: les oprandes ne sont pas
            compatibles.

            - Tests on equality allowed only: on ne peut que tester l'galit.
            - Strict inclusion not allowed: l'inclusion stricte n'est pas 
            permise.
            - File comparison not allowed: on ne peut comparer les fichiers.
            - Illegal type of operand(s): oprande de type interdit.
            - Type of operand muste be boolean: il faut un oprande de type
            boolen.
            - set element type must be scalar or subrange: le type de
            l'numration doit tre scalaire ou sous-type.
            - Set element types not compatible: les types de l'numration ne 
            sont
            pas compatibles.

            - Type of varibale is not array: la variable n'est pas un tableau.
            - Index type is not compatible with declaration: le type de l'index 
            ne
            correspond pas  sa dclaration.
            - Type of varaiable is not record: la variable n'est pas un
            enregistrement.
            - Type of variable must be pointer: la variable doit tre de type
            pointeur.
            - Illegal parameter substitution: changement de parameter interdit.
            - Illegal type of loop control variable: type interdit pour la
            variable controlant la boucle.

            - Boolean expression expected: il faut une expression de type
            boolenne.
            - Assignment of files not allowed: l'assignation de fichers n'est 
pas
            autorise.
            - Label type incompatible with selecting expression: le type de 
label
            est incompatible avec l'expression.
            - Subrange bounds must be scalar: les valeurs limites doivent tre
            scalaires.
            - No such field in this record: l'enregistrement n'a pas de ce 
champ.
            - Actual parameter must be variable: le parameter doit tre une
            variable.

            - Control variable must not be declared on intermediate level: on ne
            peut dclarer la variable de controle  un niveau intermdiaire.
            - Multidefined case label: instruction CASE dclare plusieurs fois.
            - Again forward declared: directive FORWARD a nouveau dclare.
            - Multidefined label: label dfinit plusieurs fois.
            - Multideclared label: label dclar plusieurs fois.

            - Undeclared label: label non dclar.
            - Error in base set: erreur dans l'numration.
            - Illegal function result assignment: assignation incorrecte du
            rsultat de la fonction.
            - Must EXIT to an enclosing subprogramm: on doit quitter vers une
            borne du sous-programme.
            - Control variable must not be format: on ne doit pas formater la
            variable de controle.
            - Assignment to control variable is not allowed: on ne peut pas
            assigner une variable de controle.

            - Forward referenced type "*" not completed in previous: le type de 
            la
            rfrence FORWARD pour "*" n'a pas t indiqu.
            - Forward declared subprogram "*" not completed in previous: le
            sous-programme dclar en forward n'a pas t dfini.
            - Label "*" was declared but not defined in previous block: le label
            "*" a t dclar mais non dfini au pralable.
            - Size of string must be between 1 and 255: la taille de la chaine
            doit tre entre 1 et 255.

            -  is not allowed for expressions or INLINE and TOOL subprogramms: 
            on
            ne peut utiliser l'assignation  dans les sous-programmes INLINE ou
            TOOL.
            - Type cast to a different size is not allowed: on ne peut modifier 
            la
            taille de ce type .
            - Too many nested scopes of identifiers: trop d'identifiants
            imbriqus.
            - Too many nestded procedures and/or functions: trop de procdures 
ou
            fonctions imbriques.
            - Index expression out of bounds: index hors limite.
            - Implementation restriction: limite de l'implmentation.

            ````Les erreurs d'Unit:

            - The Unit "*" require is required to USE this unit:

            Lorsque une Unit nomme dans une dclaration USES utilise une
            autre Unit non indique dans cette dclaration.

            - Repetition of unit not allowed:

            On ne peut rpter l'unit.

            - This unit must be recompiled:

            Lorsqu'une Unit nomme dans la dclaration USES a t recompile.
            Pour corriger l'erreur, il faut recompiler l'Unit indique dans
            la dclaration Uses.

            - Unable to find/open unit's symbol file:

            Lorsque le fichier ".p.o" pour l'unit indique ne se trouve pas
            dans le prfixe courant ou dans le chemin d'accs aux units
            indiqu dans Preferences.

            - Unable to write unit symbol file for this unit:

            Lorsque le compilateur ne peut crer le fichier ".p.o". La
            disquette est peut tre verrouille, absente ou pleine.

            - Unit must be recompiled with current version of compiler:

            Lorsque vous utilisez une nouvelle version TML, il faut
            recompiler vos Units.

            - Symbol table space exhausted:

            Lorsque le nombre de dclarations dans cette unit a rempli la
            mmoire disponible alloue pour la table des symboles des units.
            Il vous faut modifier cette taille de table des symboles dans le
            menu Preferences.

            ````Les erreurs du Linker:

            - Out of Memory:
            - Segment "*" specified as both CODE and DATA:

            Ces erreurs se produisent lorsque vous spcifiez le mme nom de
            segment dans une directive de compilation $DSeg segname et
            $CSeg segname.

            - Segment "*" too large:

            Un segment CODE ou DATA est plus grand que 64K. Vous devez
            re-segmenter votre programme pour qu'aucun segment ne dpasse
            cette limite. Voir chapitre 16.

            - Unresolved linker reference to symbol "*":

            Un label dfinit extrieurement ne peut tre trouv par le
            linker. Vous devez revrifier l'orthographe du symbole pour vous
            assurrer qu'il est correct.

            - Unable to create/open application file:

            Aprs une compilation sur disque, le linker essaie d'crire le
            fichier de chargement. Cette erreur se produit si ce fichier ne
            peut tre cr et/ou ouvert: disque verrouill ou absent.

            - Error in writing to application file:

            Cette erreur survient si TML a pu crer et/ou ouvrir le fichier
            d'application de sortie mais qu'une erreur s'est produite lors de
            l'criture. Ceci se produit avec un disque verouill ou plein.

            ````Les codes d'erreur GS/OS:

            Ce chapitre rpertorie les erreurs GS/OS produite lors des
            entres/sorties,  l'exclusion des codes d'erreurs -1, -2 et -3
            gnrs par les routines TML pour des erreurs spcifiques  Pascal.
            Pour de plus amples informations sur cette liste d'erreurs, 
consultez
            le manuel GS/OS Reference.

            - Erreurs gnrales:

            $00 aucune erreur.
            $01 numro d'appel GS/OS non valide.
            $04 nombre de parameters hors limite.
            $07 GS/OS actif.

            - Les erreurs d'appel aux priphriques:

            $10 priphrique absent.
            $11 n[ de priphrique non valide.
            $20 request invalide.
            $21 code d'tat ou de controle invalide.
            $22 mauvais parameter d'appel.
            $23 priphrique caractre non ouvert.
            $24 priphrique caractre dja ouvert.
            $25 table des interruptions remplie.
            $26 resources non disponibles.
            $27 I/O errreur.
            $28 aucun priphrique connect.
            $29 driver actif.
            $2B priphrique protg en criture.
            $2C dcompte d'octets invalid.
            $2D mauvais adressage de bloc.
            $2E le disque a t permut.
            $2F priphrique teint ou support absent.

            - Les erreurs d'appel aux fichiers:

            $40 syntaxe du chemin d'accs incorrecte.
            $43 n[ de rfrence incorrect.
            $44 sous-dossier inexistant.
            $45 volume absent.
            $46 fichier absent.
            $47 cration ou renommer avec un nom existant.
            $48 volume plein.
            $49 directory plein.
            $4A erreur de version.
            $4B type de stockage non accept.
            $4C fin-de-fichier rencontr.
            $4D position hors limite.
            $4E accs non autoris.
            $4F buffer insuffisant.

            $50 fichier dja ouvert.
            $51 erreur dans le directory.
            $52 type de volume inconnu.
            $53 parameter hors limite.
            $54 mmoire sature.
            $57 noms de volumes identiques.
            $58 priphriques de type autre que bloc.
            $59 niveau hors limite.
            $5A n[ de bloc trop grand.
            $5B chemin d'accs non valide pour Change Path.
            $5C fichier non excutable.
            $5D systme non accept.
            $5F trop d'applications sur la pile.
            $60 donne non disponible.
            $61 fin de directory atteinte.
            $62 classe d'appel FST non valide.
            $63 le fichier ne contient pas la resource spcifie.

            - Les erreurs spcifiques  TML:

            -1 fichier Txt non ouvert en lecture.
            -2 fichier Txt non ouvert en criture.
            -3 erreur de conversion de chaine dans un fichier Txt.

            ``APPENDIX B: LES DIRECTIVES DE COMPILATION

            Le TML offre un certain nombre de directives (ou options)
            affectant la compilation et/ou le code gnr par le compilateur. 
Ces
            directives de compilation sont  crire entre les dlimiteurs de
            commentaires .. ou (*..*). Une directive commence toujours avec le
            symbole $ et doit se trouver immdiatement aprs le dlimiteur
            d'ouverture, et elle doit tre suivie d'une lettre indiquant la
            directive.

            Il y a deux types de directives: les directives de commutation et
            les directives de parameters. Une directive de commutation donne ou
            enlve une possibilit en spcifiant + ou - juste aprs la 
directive.
            Une directive de parameter comprend une ou plusieurs chaines 
            arguments
            (noms de fichiers, noms de segments...). Une chaine argument se
            termine par un espace, une astrisque ou un crochet ferm. Si une
            chaine argument contient un de ces caractres, la chaine doit tre
            mise entre guillemets.

            Exemples:

            (*$LongGlobals+ *)
            $CSeg NewSeg

            ```LES CDA:

            (*$CDA menuName*)

            La directive CDA sert  informer le compilateur que le programme
            implmente un CDA au lieu d'une application clasique GS/OS. La
            structure d'un CDA est diffrente d'une application clasique. En
            particulier, TML doit gnrer un en-tte spcial contenant le nom du
            CDA tel qu'il apparaitra dans le menu Pomme.
            Voir le chapitre 10 pour crire son propre CDA.
            Comme le compilateur doit gnrer un code spcial pour les CDA
            avant tout autre chose, l'option DOIT se trouver avant le mot UNIT
            dans votre source. Exemple:

            (*$CDA SHRDump*)
            UNIT MySHRDump;
            ...
            end.

            ```CODE SEGMENT:

            (*$CSeg segname*)
            valeur par dfaut: (*CSeg main*)

            L'option CSeg informe le compilateur dans quel segment les sous
            programmes suivants devront tre allous. Le segment par dfaut  le
            nom rserv MAIN. Pour les autres noms de segments, toute chaine de
            caractres ne contenant pas d'espace est permise. Voir le chapitre 8
            pour plus d'informations sur l'utilisation des segments.

            ```DEFINITION DE PROCEDURE:

            (*$DefProc*)

            La directive (*$DefProc*) informe le compilateur que la prochaine
            procdure ou fonction dans le source va implmenter une dfinition 
de
            procdure Tool Box. On implmente une dfinition de procdure de la
            mme manire que pour toute autre procdure ou fonction, sauf que 
            dans
            ce cas le compilateur gnre un code particulier. Plus prcisment, 
            le
            compilateur gnre un code forant le DBR (registre de banc de
            donnes)  tre gal au banc mmoire contenant les variables 
globales
            Pascal du programme. Lorsqu'on quitte la procdure, un code
            particulier restaure les valeurs originelles du DBR.

            ```SEGMENT DE DONNEES:

            (*$DSeg segname*) valeur par dfaut: (*$DSeg _global*)
            !
            (ceci est en fait un trema ----+ )

            L'option (*$DSeg*) informe le compilateur que les variables
            globales suivantes seront alloues dans un segment particulier. Le 
            nom
            du segment par dfaut est le nom rserv _GLOBAL (_ est un trema);
            pour les autres segments, on peut utiliser toute chaine de 
caractres
            ne contenant pas d'espace, et prcde du caractre 'trema'. Le
            segment de donnes _global est le segment particulier o| le
            compilateur utilise un adressage absolu, plus performant que
            l'adressage long absolu (_ est un trema). Voir le chapitre 8 pour 
            plus
            de renseignements sur l'emploi des segments de donnes.

            ```LES REFERENCES DE VARIABLES EXTERNES:

            (*$J+*) ou (*$J-*) valeur par dfaut: (*$J-*)

            La directive de rfrence de variable externe informe TML que les
            variables globales suivantes n'auront pas de zone de stockage 
            alloue.
            A la place, la dclaration de ces variables globales est traite 
            comme
            une rfrence externe  une variable globale dclare ailleurs.
            Cette directive sert  TML pour utiliser des variables globales
            dfinies dans des modules ASM ou C.

            Exemple:

            VAR GlobVar1: integer;

            (*+J*)
            GlobVar2: integer;
            (*-J*)

            GlobVar3: integer;

            ```LONG GLOBALS:

            (*$LongGlobals+*) ou (*$LongGlobals-*)
            valeur par dfaut: (*$LongGlobals-*)

            Cette option informe le compilateur de commuter (+) ou de
            dsactiver (-) la gnration d'adressage absolu long pour les
            variables globales dans le segment de donnes _global (_ est un
            trema). Normalement, le compilateur gnre un code qui force le DBR
            (banc de registre donnes)  tre le mme que le banc mmoire
            contenant les varibales globales alloues dans le segment de donnes
            _global (_ est un trea). Cependant, dans certaines occasions, le
            programme exige que ces bancs soient diffrents. Dans ces cas, il 
            faut
            indiquer au compilateur que l'on veut accder aux variables globales
            du segment de donnes _global par un adressage absolu long. (_ est 
un
            trema)

            ```LES NDA:

            (*$NDA period event Mask menuName*)

            La directive NDA informe le compilateur que le programme est un
            NDA et non une application GS/OS standard. La structure d'un NDA est
            diffrente de celle d'une application normale. En particulier, TML
            doit gnrer un code spcial en en-tte indiquant la priode (en
            1/60me de secondes), intervalle d'accs priodique au NDA; un
            EventMask dcrivant le type d'vnements grs par le NDA; et le Nom
            qui apparaitra dans la liste des NDA (menu Pomme).
            Voir le chapitre 9 pour de plus amples informations sur la
            structure des NDA.
            Comme le compilateur doit gnrer un code spcial en en-tte pour
            les NDA, cette option DOIT se trouver avant le mot rserv UNIT dans
            votre source. Exemple:

            (*$NDA 60 -1 TMLClock*)
            UNIT TMLClock;
            ...
            END.

            ```TAILLE DE LA PILE:

            (*$StackSize numbytes*) valeur par dfaut: (*$StackSize 8096*)

            La directive StackSize informe TML de la taille (en octets)
            alloue pour la pile d'excution de l'application. Cette pile
            d'excution sert  conserver l'adresse de retour des sous-programmes
            ainsi que les variables locales. L'usage intensif de variables 
            locales
            va donc dcider de la taille de la pile.
            La valeur par dfaut de cette pile est 8K (8096 octets). Si un
            programme ncessite plus ou moins de place, il faut alors spcifier 
            la
            taille. Cependant, au moins 1K (1024 octets) et au plus 40K (40960)
            peuvent tre alous (bien que TML ne vrifie pas la taille spcifie
            dans la directive). Voir l'appendix D pour plus d'information sur
            l'emploi des piles d'excutions.
            Notez que cette option DOIT se trouver avant le mot rserv
            PROGRAM dans votre code. Exemple:

            (*StackSize 10240*)
            PROGRAM MyProgram;
            begin
            ...
            end.

            ```LE PREFIXE DE RECHERCHE DES UNITS:

            (*$U GSOS prefix*) valeur par dfaut: (*$U 0:*)

            Cette option permet d'utiliser un prfixe particulier pour
            rechercher le suffixe des units (.P.O). Le TML ne recompile pas les
            interfaces des units indiques dans USES, mais il charge une table
            pr-compile des dclarations  partir d'un fichier '.P.O'. Afin de
            rechercher ces fichiers, TML utilise un prfixe d'accs aux units; 
ce
            prfixe est :0 par dfaut (prfixe en cours). On peut donc spcifier
            un prfixe particulier de recherche avec cette directive: exemple:

            USES TYPES,
            (*$U :TML:MYSTUFF:*) HandyRoutines;

            Notez que si les fichiers '.P.O' ne peuvent tre trouvs avec la
            direcive de compilation ($U*), TML essaira de les trouver en 
            utilisant
            le prfixe de recherche indiqu dans le menu Preferences (voir le
            chapitre 5). Si un fichier '.P.O' ne peut tre trouv avec aucun des
            prfixes, une erreur est retourne.

            ```LES ERREURS DE FONCTION TOOLBOX:

            (*$ToolErrorChk+*) ou (*$ToolErrorChk-*)
            valeur par dfaut: (*$ToolErrorChk+*)

            Cette directive permet  une application de grer les erreurs
            d'appels aux fonctions de la boite  outils. Comme nous l'avons vu 
au
            chapitre 20, TML gnre un STA _ToolErr aprs chaque appel  une
            fonction ToolBox. Ainsi, la variable globale _ToolErr contient
            toujours le code d'erreur retourn par la dernire fonction appele.
            Une valeur de _ToolErr diffrente de 0 indique qu'une erreur s'est
            produite lors de l'excution de la dernire fonction ToolBox, et la
            valeur de _ToolErr sert  dterminer quel est le type d'erreur
            survenue.
            Dans la plupart des cas, une application n'a pas besoin de
            ramener systmatiquement l'erreur aprs chaque appel  une fonction
            ToolBox. Aussi on peut dconnecter cette option afin de produire un
            code moins volumineux.

            ``APPENDIX C: LES UNITS TOOLBOX:

            La boite  outils du //GS est constitue d'une importante
            collection de routines facilitant la programmation. La boite  
outils
            implmente la gestion du graphisme via QuickDraw ainsi que la 
gestion
            du bureau (y compris les fentres, menus, dialogues, controles...).

            Comme on l'a vu au chapitre 8, TML permet d'accder  la boite 
            outils  l'aide de diffrentes Units. Cet appendix liste de manire
            exhaustive les units pr-dfinies mises  votre disposition.
            Vu l'ampleur des fichiers, ceux-ci ne seront pas lists dans la
            prsente documentation, nous renvoyons le lecteur  son traitement 
de
            texte prfr pour diter et imprimer les fichier '.P' se trouvant
            dans le dossier LIBRARIES de la disquette SOURCE CODE LIBRARY.

            ``APPENDIX D: AU COEUR DU TML

            ```LA GESTION MEMOIRE ET LE TML:

            L'environnement dans lequel une application va fonctionner peut
            tre divise en 4 parties: le code de l'application, les variables
            globales, la pile d'excution et la mmoire disponible. Ces 4
            composants de l'application doivent co-exister dans la RAM du GS. La
            mmoire du GS est partitionne en bancs de 64K, et est gre par le
            Memory Manager. Un Apple //GS standard comprend 4 bancs de 64K de 
RAM
            numrots $00, $01, $E0 et $E1. On peut ajouter des cartes 
            d'extension
            RAM entre les bancs $02 et $7F: les autres bancs sont soient 
rservs
            soient non disponibles.

            ````Le code de l'application:

            Une application peut tre constitue de un ou plusieurs segments.
            Les petits programmes sont souvent constitus d'un seul segment, 
mais
            les trs grosses applications sont divises en plusieurs segments 
car
            chaque segment ne peut excder 64K. En effet, un segment ne peut
            chevaucher deux bancs mmoires.

            TML gnre un module indpendant pour chaque procdure et
            fonction dclare daans le programme. Chacun de ces modules est
            associ  un nom de segment  charger servant  organiser entre eux
            les segments lors du linkage. Le nom du segment par dfaut est MAIN.
            Lorsqu'une application est suffisamment volumineuse pour ncessiter
            plusieurs segments, on doit utiliser la directive (*$CSeg segname*)
            afin de dclarer le nom du segment associ aux procdures suivantes.
            On redclare le segment par dfaut au compilateur avec la directive
            (*$CSeg main*).

            ````Les variables globales:

            TML stocke les variables globales dans un segment de donnes. Par
            dfaut, les segments de donnes ont le nom "_global" (_ est un 
            trema).
            Le linker utilise les noms des segments de chargement associ avec
            chaque segment de donnes afin de les grouper en segment de
            chargement. Les programmes sont en principe constitus d'un seul
            segment de donnes, mais les applications ncessitant une grande
            quantit de variables globales sont fractionns en plusieurs 
segments
            de donnes. En effet, chaque segment de donnes ne peut excder la
            taille d'un banc mmoire: soit 64K.

            Lorsqu'une application ncessite plusieurs bancs de donnes, on
            doit utiliser la directive (*$DSeg segname*) afin d'indiquer au
            compilateur qu'on souhaite allouer un autre segment pour les 
            variables
            suivantes. On peut redonner le nom du segment principal au 
            compilateur
            avec la directive ($DSeg _global*). (_ est un trema)

            Lors de l'excution du code d'initialisation gnr par TML, le
            registre du banc de donnes du 65816 (le DBR) est positionn pour
            pointer sur sur le banc de mmoire contenant les variables globales
            dclares dans le segment _global (_ est un trema). Pour cela, les
            rfrences aux variables globales du segment _global peuvent 
utiliser
            un adressage absolu (_ est un trema). Les variables globales dans 
les
            autres segments de donnes sont adresss en mode long absolu (moins
            rapide et plus gourmand en mmoire).

            ````La pile d'excution:

            La pile d'excution est un bloc mmoire spcial que l'application
            utilise pour stocker l'adresse de retour des procdures et fonctions
            et pour conserver les parameters et les variables locales. Lors de
            l'excution du code d'initialisation de l'application, un bloc de
            mmoire est allou dans le banc $0 (car c'est le seul banc mmoire
            dans lequel le registre de pile du 65816 peut fonctionner).

            Par dfaut, le TML dfinit une pile de 8K (8096 octets). Si une
            application  besoin de plus ou moins de place pour sa pile, vous
            devez l'indiquer avec la directive (*$StackSize numbytes*).

            La directive (*$StackSize numbytes*) doit se trouver avant le mot
            rserv PROGRAM. Par exemple, le code suivant va gnrer une pile de
            10K pour l'application:

            (*StackSize 10240*)
            PROGRAM MyApp;
            ...

            Les accessoires de bureu n'ont pas de code d'initialisation
            allouant et initialisant la pile d'excution puisqu'ils fonctionnent
            dans l'environnement d'une application. Donc, en crivant vos
            applications, asssurez-vous que vous laissez une place mmoire
            suffisante dans la pile pour l'utilisation de NDA ou CDA. Et bien 
            sur,
            en crivant un accessoire de bureau, faites en sorte d'utiliser le
            moins possible de place dans la pile. Souvenez-vous toujours que la
            taille de la pile par dfaut est de seulment 8K.

            Ni le GS ni TML ne peuvent dterminer la taille de la pile
            utilise par l'application. Si vous avez rserv une place
            insuffisante pour la pile d'excution, des zones mmoires seront
            dtruites lors de l'excution de votre application.

            ````La mmoire disponible:

            La mmoire disponible est la mmoire non utilise par le code de
            l'application, ses segments de donnes et sa pile d'excution. Cette
            mmoire libre est mise  disposition de l'application par le Memory
            Manager,  l'aide des routines se trouvant dans l'unit GSIntf.Pas. 
On
            peut galement rserver et librer de la mmoire dans cette zone
            disponible avec les procdures New et Dispose.
            Chaque application va avoir besoin de rserver au moins un bloc
            mmoire dans le banc 0 pour initialiser les outils. Et la plupart 
des
            applications auront besoin de plusieurs pages rserves dans le banc
            0. Ces pages sont appeles PAGES ZERO.

            ```REPRESENTATION DES DONNEES:

            Ce chapitre va vous montrer comment chaque type de donne est
            stock dans la mmoire du GS. Vous noterez que le 65816 stocke 
chaque
            octet d'un mot selon la reprsentation poids faible-poids fort; ce 
            qui
            signifie que les bits les plus signifiants sont dans la zone mmoire
            la plus haute. Par exemple:

            type essai = packed record
            case integer of
            0: (int: integer);
            1: (highbyte: 0..255;
            lowbyte : 0..255);
            end;

            Cet enregistrement ne donne pas le rsultat que l'on pense. Avec
            le 65816, en rfrenant highbyte, on retourne l'octet de poids 
            faible
            de l'entier int, et non l'octet de poids fort. Les paragraphes
            suivants vont vous expliquer comment Pascal stocke ses types de
            donnes.

            Integer: le complment  2 d'un entier sign dans
            l'intervalle -32768/32767 et ncessitant 2 octets de
            stockage. Le bit 15 est le bit de signe.

            7 0 15 8



            I ISI I (S est le bit de signe)




            LongInt: le complment  deux d'un entier dans l'intervalle
            -2147483648/2147483647 et ncessitant 4 octets de
            stockage. Le bit 31 est le bit de signe.




            !7 0!15 8!23 16! 24!




            Boolean: un type numr de (False,True) ncessitant un octet
            de stockage, la valeur boolenne tant dans le bit
            0. Un octet de stockage est utilis dans un packed
            array ou un record.




            !7 0!15 8!




            Char: type numr de caractres ASCII ayant 256 valeurs
            possibles. La valeur du caractre ncessite  octets
            de stockage, la valeur tant dans l'octet de poids
            fort (bits 7-0). Un octet de stockage est utilis
            dans les packed array ou les record.




            !7 0!15 8!




            Enumeration: un octet non sign ou un entier sur deux octets. Si
            le type d'numration contient moins de 128
            constantes, la premire valeur du type occupe un
            seul octet de stockage si elle est employe dans un
            packed array ou un record; autrement elle occupe
            deux octets.




            !7 0!



            <= 128 numrations



            !7 0!15 8! > 128 numrations





            Subrange: un octet sign, un mot ou un mot long. si
            l'intervalle est dans -128/127, un mot est employ
            dans les structures non packes ou les variables
            simples; mais dans un packed array ou un record, un
            seul octet est utilis pour reprsenter le subrange.
            Si l'intervalle est dans -32768/32767, on utilise un
            mot; autrement un mot long est employ pour la
            reprsentation.




            !7 0! -128..127







            !7 0!15 8!
            -32768..32767







            !7 0!15 8!23 16!31 24! les autres




            Single: un nombre rel sur 32 bits reprsent en format
            simple prcision IEE, implment en type SANE
            Single.

            31 30 23!22 0



            !S! exposant ! signifiant !




            Double: un nombre rel sur 64 bits reprsent en format
            double prcision IEE, implment en type SANE
            Double.

            63 62 52 51 0



            !S! exposant ! signifiant !




            Real/Extended: un nombre rel sur 80 bits reprsent en format
            tendu standard IEE. Tous deux sont implments en
            type SANE Extended.

            79 78 64 63 0



            !S! exposant ! signifiant !




            String[n]: une chaine pascal de n+1 octets de long. Cette
            chaine est constitue d'un octet de longueur
            (longueur de la chine, non compris cet octet) suivi
            des octets contenant les caractres ASCII.

            octet 1 2 3 ... n+1



            !long ! ! ! ... ! !




            Pointers: une adresse mmoire sur 24 bits, occupant 4 octets
            de stockage. Seuls 3 octets servent  stocker une
            adresse sur 24 bits, aussi les bits 31-24 sont
            toujours  0. Le pointeur NIL est reprsent par la
            valeur zro sur 32 bits.




            !7 0!15 8!23 16!31 24!




            Sets: Squence d'octets jusqu' un maximum de 32 octets ou
            256 bits reprsentant la grandeur du type de base.
            Le nombre d'octets utiliss est le nombre minimum
            utilis pour reprsenter cette grandeur. La valeur
            ordinale du type de base est reprsente par un seul
            bit. Si la valeur ordinale fait partie d'un
            ensemble, alors son bit est  1, autrement il est 
            0. Si les valeurs ordinales du type de base sont
            dans l'intervalle 0..15, alors deux octets
            reprsentent l'ensemble. Si les valeurs ordinales du
            type de base sont dans l'intervalle 0..31,alors 4
            octets le reprsentent, etc...

            Files: une structure de donnes sur 22 octets, utilise de
            manire interne par TML. En plus de la variable
            fichier, le fichier ouvert associ avec un disque
            externe a un buffer d'accs allou dans la mmoire
            libre pour la gestion GS/OS; de plus un fichier
            texte a un buffer de 256 octets.

            Arrays-Records: les composants d'un tableau non compact et de
            records sont allous conscutivement comme dfini
            plus haut. Les tableaux sont stocks ligne par
            ligne. C'est  dire que le dernier indice est celui
            qui augmente le premier. Les composants des
            enregistrements sont allous dans l'ordre de leur
            apparition dans la dclaration.
            L'implmentation de TML effectue un compactage des
            donnes uniquement au niveau de l'octet, le
            compactage au niveau des bits n'est pas possible. Un
            type de donnes est reprsent par un octet dans les
            enregistrements compacts si et seulement si le
            nombre de bits ncessaires pour stocker toutes les
            valeurs du type est infrieur ou gal  8 bits. Par
            exemple, le type standard Char ou boolean ncessite
            moins de 8 bits pour reprsenter toutes leurs
            valeurs, cependant dans un enregistrement compact,
            char ou boolean sont reprsents sur un octet;
            autrement ils utilisent un mot.

            ```LES CONVENTIONS D'APPEL:

            ````Appeler un sous programme:

            TML passe ses parameters en utilisant la pile lors des appels 
            des sous-programmes. Avant d'appeler une procdure ou une fonction,
            les parameters sont pousss sur la pile dans le mme ordre que leur
            dclaration. Si une fonction est appele, le stockage du rsultat 
est
            allou sur la pile avant d'empiler les parameters. Lorsque l'appel 
            est
            termin, le controle est repass au programme principal avec les
            parameters ventuels dpils, mais le rsultat de la fonction (si
            c'est une fonction) est laiss sur la pile. Le programme doit 
dpiler
            ce rsultat lorsqu'il l'a utilis.

            Voici un exemple d'appel  une procdure:

            lda pppp ; empiler le 1er parameter
            pha
            ...
            lda pppp ; empiler dernier parameter
            pha
            jsl >Aproc ; appel de la procdure
            ; parameters ots de la pile

            Voici un exemple d'appel  une fonction:

            pha ; rserver de la place pour
            rsultat
            lda pppp ; empiler le 1er parameter
            pha
            ...
            lda pppp ; empiler dernier parameter
            pha
            jsl >Afunc ; appel de la fonction
            ; parameters ots de la pile
            pla ; dpiler le rsultat et
            ; le mettre dans l'accumulateur

            Les sous-programmes sont toujours appels en mode natif 65816
            (accumulateur et registres d'index sur 16 bits). Cependant, si le
            processeur n'est pas en mode natif avant l'appel, il est forc au 
            mode
            natif avant que l'appel ne soit effectu. Par exemple, si
            l'accumulateur est en 8 bits et les registres d'index en 16 bits, le
            code suivant est gnr:

            ; accumulateur en 8 bits
            rep #$20 ; accumulateur en 16 bits
            LONGA ON
            jsl >ASubprog

            Si le sous-programme appel est dclar  un niveau autre que le
            niveau global (c'est  dire ailleurs que dans le bloc principal ou
            dans une unit), alors un lien statique est pouss sur la pile aprs
            que les parameters aient t empils. Ce lien statique sert  
            adresser
            les variables locales dans les piles imbriques. Du fait de ce lien
            statique, l'adresse d'un sous-programme imbriqu ne doit jamais tre
            passe  une routine de la boite  outils comme dfinition de
            procdure puisque ce n'est pas la convention utilise par les 
outils.

            ````Les variables parameters:

            Les variables parameters (VAR) sont toujours passes par
            rfrence au parameter de format, c'est  dire comme une pointeur 
sur
            la zone de stockage occupe par le parameter actuel. Le pointeur est
            pass sous forme de valeur sur 32 bits (4 octets)). Le mot de poids
            fort est empil avant le mot de poids faible.
            Dans l'exemple suivant, le passage de la variable globale GlobVar
            en tant que parameter VAR se fait par l'adressage absolu:

            pea GlobVar|-16 ; empiler le mot de poids fort
            pea GlobVar ; empiler ensuite mot de poids
            faible

            ````Les valeurs parameters:

            Les valeurs parameters sont passes avec leurs valeurs sur la
            pile ou par rfrence, selon la taille de la valeur. Si la taille de
            la valeur du parameter occupe 4 octets ou moins, alors la valeur est
            passe par la pile. Si la taille de cette valeur est suprieur  4
            octets, alors un pointeur 32 bits sur la valeur est empil. La
            procdure ou fonction appele copie alors la valeur en stockage 
local
            de manire  ce que toute modification de la valeur du parameter
            formel n'affecte pas la valeur du parameter actuel.

            ````Les parameters statiques:

            Les parameters statiques sont empils de la mme manire que les
            valeurs parameters. La diffrence entre les parameters par valeur et
            les parameters statiques est que si la taille du parameter actuel 
est
            plus grande que 4 octets, la procdure ou fonction appele NE 
RECOPIE
            PAS la valeur dans un stockage local pour le parameter formel. 
Ainsi,
            il est illgal de donner une nouvelle valeur au parameter statique
            formel puisqu'il changera la valeur du parameter actuel.

            Les parameters statiques ont t introduits dans TML 2 afin de
            conserver la taille de la pile d'excution pour le stockage des
            parameters formels ainsi que pour acclrer le traitement des
            informations.
            Attention, TML ne vrifie pas si une nouvelle valeur a t
            assigne  un parameter statique. C'est au programmeur de s'assurer 
            de
            l'emploi correct des parameters statiques.

            ````Les rsultats de fonctions:

            Le stockage des rsultats de fonctions est rserv sur la pile
            par le sous-programme appelant avant l'empilage des parameters. Si 
le
            rsultat de la fonction est de type Integer, LongInt, char, boolean,
            subrange, numration, pointeur ou single real, alors 2 ou 4 octets 
            de
            stockage sont allous. Si le type du rsultat ne ncessite qu'un
            octet, 2 octets sont allous et la valeur est stocke dans l'adresse
            la plus basse.

            Si le type du rsultat est double, Comp, Extended, tableau,
            chaine ou record, alors le sous-programme appelant alloue un espace
            temporaire dans ses piles pour le rsultat, et il empile un pointeur
            de 4 octets sur la zone temporaire. Le sous-programme appelant 
dpile
            le pointeur lorsque la fonction retourne le rsultat et la zone
            temporaire de stockage est libre s'il n'y a aucune rfrence  la
            valeur.

            ````Code d'entre-sortie:

            Chaque procdure et fonction Pascal commence et finit par un code
            d'entre et de sortie standards.
            Voici le code standard d'entre:

            phd ; sauver prcdent pointeur de pile
            tsc
            sec
            sbc #xx
            tcd ; crer nouveau pointeur de pile
            clc
            adc #yy
            tcs ; allouer stockage local

            D'abord, le registre de page directe en cours est sauv. Le
            registre de page directe est utilis comme pointeur. Le pointeur 
            sauv
            est appel lien dynamique et sert  remettre les choses telles
            quelles.

            Aprs avoir sauv le pointeur de pile, xx octets sont ots du
            pointeur de pile courant afin de crer le nouveau pointeur. XX est
            calcul de manire que le premier mot de stockage dans la pile 
(c'est
             dire le rsultat de la fonction ou le premier parameter) est  un
            multiple de 254 dans la page directe. Grace  ce choix, les 
            parameters
            et la plupart des variables locales sont adresses par l'adressage 
en
            page directe.

            Lorsque le pointeur de pile est dfini, yy octets sont ajouts 
            cette valeur pour allouer l'espace ncessaire au stockage des
            variables locales, des valeurs des parameters copis localement et
            pour les besoins du compilateur.
            Aucun registre n'est sauv et on suppose que le processeur est en
            mode natif.

            Voici le code de sortie standard:

            tdc
            clc
            adc #xx
            tcs ; dsallouer le stockage local
            pld ; rcuprer pointeur de pile

            lda 2,S
            sta mm,S
            lda 1,S ; adresse de retour mise sous
            sta mm-1,S ; les parameters
            tsc
            clc
            adc #mm-2 ; dsallouer les parameters
            tcs
            rtl

            Le stockage local est d'abord dsallou en ajoutant la valeur xx
            au pointeur de pile. Puis on rcupre le pointeur de pile prcdent
            grace  l'instruction pld. Ensuite les parameters sont "ots" en
            dplaant l'adresse de retour juste au dessus du premier parameter 
et
            en repositionnant le pointeur de pile sur cette nouvelle adresse.
            Finalement, RTL est excut pour revenir au sous-programme d'appel.
            Remarquez que si une procdure ou fonction n'a pas de parameters,
            le code de sortie est alors:

            tdc
            clc
            adc #xx
            tcs ; dsallouer le stockage local
            pld ; rcuprer le pointeur de pile
            rtl

            ``APPENDIX E: COMPARAISON DE TML 2 ET TML 1

            TML Pascal II implmente de nouvelles fonctions par rapport 
            l'ancienne version TML I. Dans ce chapitre nous allons voir les
            diffrences entre les deux versions afin que les anciens 
utilisateurs
            de TML I puissent facilement s'adapter  ce nouveau produit.
            Dans ce qui suit, les diffrences entre les version sont
            prsentes chapitre par chapitre.

            ```CHAPITRE 1: DECOUVRIR TML

            La diffrence la plus importante entre TML I et TML II est la
            spcificit de TML II pour le GS/OS 5.0. Les applications 
dveloppes
            avec TML II ne peuvent pas fonctionner avec un systme antrieur  
la
            version 5.0 ni avec les versions de Prodos 16.
            Cette limitation est due en grande partie  l'implmentation du
            Resource Manager dans TML II, outil non disponible dans les versions
            antrieures  5.0 du systme.

            ```CHAPITRE 2: UTILISER L'ENVIRONNEMENT DESKTOP

            L'diteur du TML II permet l'ouverture d'un nombre illimit de
            fentres  l'cran. De plus, dans chaque fentre, on peut utiliser 
            une
            fonte et un style particulier ainsi qu'une tabulation personnalise.
            Enfin, l'diteur acccepte dsormais la commande UNDO.
            Enfin, l'environnement d'dition permet de crer une fentre
            d'dition pour les fichiers resources.

            ```CHAPITRE 3: CREER DES PROGRAMMES

            La convention de dnomination des fichiers a chang avec TML II.
            Les fichiers sources doivent se terminer par le suffixe '.p' au lieu
            de '.pas'.
            Le nom des fichiers compils Units est galement modifi: au lieu
            de '.usym', le suffixe est dsormais '.o' ajout par le compilateur,
            ce qui donne un suffixe total de '.p.o'. Ces conventions permettent 
            au
            compilateur de retrouver aisment les modules dont il a besoin.
            L'item menu RESOURCES a t ajout dans le menu COMPILE afin de
            pouvoir spcifier quelles sont les resources  compiler dans
            l'application finale.

            ```CHAPITRE 4: LES RESOURCES

            Les resources sont une nouvelle fonction du TML II. Les
            programmes crits avec TML I devraient tre convertis sans trop 
            tarder
            en TML IIafin de tirer partie des fonctionnalits du Resource 
            Manager.

            ```CHAPITRE 7: APPLICATIONS GRAPHIQUES

            Le TML I implmentait les applications 'plain vanilla'. Ceci a
            t remplac par les applications 'textbook graphics'. A l'origine, 
            un
            programme pouvait spcifier les parameters (Input, Output) en 
en-tte
            pour indiquer que l'on voulait travailler en environnement Plain
            Vanilla. Exemple:

            Program Test(Input, Output);

            Plain Vanilla connecte l'cran graphique en mode 640 et cre une
            fentre intitule 'TML PASCAL'. Ceci permet de dvelopper facilement
            des applications graphiques.
            TML Pascal II possde une nouvelle procdure appele 'Graphics'.
            Cette procdure accepte un parameter de dfinition du mode 
graphique:
            320 ou 640; et au lieu d'ouvrir une fentre  l'cran, elle permet 
de
            travailler sur l'cran total.

            ```CHAPITRE 8: APPLICATIONS DESKTOP

            Les applications peuvent dsormais utiliser les resources pour
            crer des menus, fentres, dialogues... Les resources sont cres 
            partir du TML Resource Editor. On spcifie les resources  compiler
            avec le programme principal avec la fonction Resources du menu
            Compile.

            ```CHAPITRE 9: LES NDA

            Le code source d'un NDA peut dsormais tre crit sous forme de
            Unit. Les NDA n'ayant pas de programme MAIN, il n'est pas ncessaire
            d'employer la structure des programmes.

            ```CHAPITRE 10: LES CDA

            Le code source d'un CDA peut dsormais tre crit sous forme de
            Unit. Les CDA n'ayant pas de programme MAIN, il n'est pas ncessaire
            d'employer la structure des programmes.

            ```CHAPITRE 11: LES MOTS RESERVES

            Le TML II dfinit 3 constantes relles afin de faciliter
            l'criture d'applications numriques. Ces nombres sont Inf (infini),
            NaN (not a number) et PI.

            ```CHAPITRE 19: ENTREES-SORTIES

            Le TML II implmente dsormais la procdure OPEN pour ouvrir un
            fichier en criture/lecture alatoire.
            Le TML II est compatible GS/OS. Ainsi les noms de fichiers
            doivent respecter la syntaxe Prodos 16 ou GS/OS. De plus, les noms 
de
            devices peuvent tre utiliss. Par exemple, le nom du device
            imprimante est'.PRINTER' au lieu de 'PRINTER'. A noter que le nom
            '.PRINTER' doit tre crit en majuscules.

            ```CHAPITRE 20: PROCEDURES ET FONCTIONS STANDARDS

            La procdure GRAPHICS est nouvelle dans TML II.
            Les fonctions et procdures standard suivantes ont t renommes
            dans TML II afin de se conformer aux spcifications Apple:

            nom en TML I nom en TML II

            BitAnd BAND
            BitOr BOR
            BitXor BXOR
            BitNot BNOT
            BitSL BSL
            BitSR BSR
            BitRotl BROTL
            BitRotr BROTR
            HiWord HiWrd
            LoWord LoWrd

            Dans TML II, HiWord et LoWord sont rservs pour les fonctions de
            IntMath.p.
            La variable globale prdfinie retournant un code d'erreur
            s'appelle dsormais '_ToolErr', mais l'ancien nom '_ToolErrorNum' 
est
            galement accept.

            ```ANNEXE B: DIRECTIVES DE COMPILATION

            Les directives suivantes ont t renommes:

            $DeskAcces renomm en $NDA
            $P $U
            $XrefVar $J

            Les directives suivantes ont t ajoutes depuis la version 1 (et
            taient donc dja disponibles dans la version 1.5).

            $CDA
            $DefProc

            ```ANNEXE C: LES INTERFACES

            Les interfaces de la boite  outil ont t largement modifies
            afin d'tre compatible avec le systme 5.0. Certaines interfaces ont
            t rajoutes.

            ```ANNEXE D: AU COEUR DU TML

            Le type Boolean, Enumeration et les petits ensembles d'entiers
            sont reprsents sur 2 octets au lieu d'un. Cependant, lorsque ces
            types sont des Packed Record ou Array, ils n'utilisent plus qu'un
            octet en mmoire.

             

      Default Template for Easy Text To HTML Converter
